gpt4 book ai didi

ruby-on-rails - rails : complicated design choice: polymorphism? STI?

转载 作者:行者123 更新时间:2023-12-04 06:32:21 26 4
gpt4 key购买 nike

在设计这个应用程序时,我一直在尝试不同的技术,这对我来说非常复杂,因为有很多解决方案可供选择。确定这些解决方案中哪一个是最好的已成为我过去几周的全职工作。

背景:

我有一个 User 模型,其中包含一些非常基本的身份验证功能。该应用程序将具有三种不同类型的用户;管理员、买家和卖家。用户类型将在注册期间确定,其中一个复选框将询问用户是否是卖家。如果选中该框,则用户是卖家,如果未选中该框,则假定他们只是买家。我宁愿没有下拉菜单来选择用户类型(买家、卖家)。到目前为止很简单。

详情:

卖家有个人资料,访问该网站的用户将能够浏览不同的卖家并查看他们的个人资料。买家没有个人资料,不应在网站上列出供用户查看。如果这还不够复杂,买家应该可以选择更改他们的帐户类型并成为卖家。同样,卖家可以更改他们的账户类型并“停用”他们的卖家账户,将他们从卖家列表中删除。

设计选项:

单表继承:

我在尝试使用 STI 实现这一点时想到的不是最优的。我面临两个选择:一个困惑的 Controller ,它根据上面提到的复选框决定创建什么类型的用户(一个 Controller - UsersController),或者两个相同的不同注册表单(两个 Controller - BuyersController , 卖家 Controller )。

has_one 或“has_none”配置文件关联:

class User < ActiveRecord::Base
has_one :profile # only if the user_type or role is "seller"
end

class Profile < ActiveRecord::Base
belongs_to :user
end

在这里我会使用像 CanCan 或 declarative_authorization 这样的东西,让用户通过上面提到的复选框选择他/她的角色。这会带来安全风险,因为会有管理员角色,我不希望它对批量分配开放。

我想无论您怎么看,我都会有一个困惑的 Controller ,其中包含关于如何创建用户的条件。除非我选择有两个复选框(“我是卖家”和“我是买家”),但这似乎是多余的。似乎无论我选择哪种设计,我都会面临一些骇人听闻的解决方案。

也许引入一些介于 User 和用户类型之间的模型?

有什么意见吗?

最佳答案

我真的不认为您需要 STI 或多态性。单个用户模型就足够了。我会向您的用户模型(管理员?、买家?、卖家?)添加三种方法,并添加仅返回买家、卖家或管理员的范围。

在您的情况下,听起来您的用户角色数量确实很少(现在是 2 个,管理员扩展到 3 个)。我可能会使用 Ryan 在 "Embedded Associations" 中讨论的技术Railscast.

我在最近的项目中做了一些非常相似的事情,然后在此基础上使用了 CanCan(在我的例子中,2.0 alpha 分支,因为我觉得它更简单)。你的能力类看起来像这样(在 2.0 语法中,但你可以用 1.x 做同样的事情,我敢肯定)

class Ability
include CanCan::Ability

def initialize(user)
if user.seller?
can :create, :profile
else
...
end
end
end

关于ruby-on-rails - rails : complicated design choice: polymorphism? STI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7907703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com