gpt4 book ai didi

ruby-on-rails - Devise 中两种截然不同的用户模型

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:05 24 4
gpt4 key购买 nike

我的应用程序中有两种不同类型的用户,他们使用 Devise 通过 Rails 4 进行身份验证,但他们的字段非常不同。一个是买方,另一个是卖方。买方必须有位置和付款信息,而卖方则没有。最初我认为创建两个独立的 Devise 模型是个好主意,但必须有更好的方法。我考虑过将它们全部保存在同一个表中并序列化买方的付款数据。

什么是好的解决方案?

最佳答案

看看 STI - 简而言之,您创建一个名为 User 的基本模型,然后创建两个子类 User::BuyerUser::Seller(不需要命名空间,但推荐使用)。两个模型都存储在同一个表中,应用于 User 模型的所有内容都会影响这两个类。更多关于 STI here

更新:

如果您不希望有许多空表格单元格,您可以使用 1-1 关联来保留所有类特定的详细信息。您还可以添加一个包装器来完全封装它。它可能看起来像这样:

class User < ActiveRecord::Base
belongs_to :details, polymorphic: true

def method_missing(method, *args)
return details.send(method, *args) if details.respond_to? method
super
end
end

class BuyerDetails < ActiveRecord::Base
has_one :user, as: :details

# buyer_attribute column
end

class SellerDetails < ActiveRecord::Base
has_one :user, as: details

#seller_attribute
end

然后您可以将它与 STI 混合使用:

class User::Buyer < User
def initialize(*args)
super
details = BuyerDetails.new
end
end

class User::Seller < User
def initialize(*args)
super
details = SelerDetails.new
end
end

然后你可以简单地使用:

user = User::Buyer.new
user.buyer_attribute #=> nil
user.seller_attribute #=> NoMethod error!

注意:您的User 模型需要details_type 字符串列以及details_id 才能使多态关联起作用。对于 STI,您将需要另一列 type

关于ruby-on-rails - Devise 中两种截然不同的用户模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21110984/

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