我的应用程序中有两种不同类型的用户使用Devise使用Rails 4进行身份验证,但它们的字段非常不同。一个是买方,另一个是卖方。买方必须拥有位置和付款信息,而卖方则没有。最初我认为创建两个独立的Devise模型是个好主意,但必须有更好的方法。我想把它全部保存在同一个表格中并序列化买方的付款数据。
什么是好的解决方案?
答案 0 :(得分:1)
查看STI - 简而言之,您创建了一个名为User
的基本模型,然后创建了两个子类User::Buyer
和User::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!
注意:您需要details_type
模型上的User
字符串列以及details_id
才能使用多态关联。对于STI,您需要另一列type
。
答案 1 :(得分:0)
老实说,我使用的是多态关系。我保持用户模型非常适合身份验证,然后使两个新模型(买方和卖方)与他们不共享的字段共享。这与上面显示的BroiSate方法非常接近。
实施例
class User < ActiveRecord::Base
belongs_to :authenticatable, polymorphic: true
end
class Buyer < ActiveRecord::Base
has_one :user, as: :authenticatable
# Add buyer specific fields to this table
end
class Seller < ActiveRecord::Base
has_one :user, as: :authenticatable
# Add seller specific fields to this table
end