Ruby on rails 不同用户类型的Rails关联
我有一个用户模型,并希望将个人资料信息附加到它特定于性别 除了保存性别中立数据的用户模型(如下图所示)之外,我是否应该有一个FemaleProfile&MaleProfile模型 用户模型:Ruby on rails 不同用户类型的Rails关联,ruby-on-rails,database,Ruby On Rails,Database,我有一个用户模型,并希望将个人资料信息附加到它特定于性别 除了保存性别中立数据的用户模型(如下图所示)之外,我是否应该有一个FemaleProfile&MaleProfile模型 用户模型: has_one :FemaleProfile has_one :MaleProfile Fields :Name, :Age 女性轮廓模型: belongs_to :User Fields :Name, :Age, :Dress_Color belongs_to :User Fields :Nam
has_one :FemaleProfile
has_one :MaleProfile
Fields :Name, :Age
女性轮廓模型:
belongs_to :User
Fields :Name, :Age, :Dress_Color
belongs_to :User
Fields :Name, :Age, :Tie_Color
MaleProfile模型:
belongs_to :User
Fields :Name, :Age, :Dress_Color
belongs_to :User
Fields :Name, :Age, :Tie_Color
我不明白的是,如果这是真的,一个用户有一个男性或女性的个人资料,但协会有两种类型的个人资料与用户关联
是否存在反向多态关系?我已经看了STI,但它不允许继承模型的字段。 < P>我将在这个CAS中使用<代码>多表继承< /COD>。我个人使用
citier
gem来实现这一点:
具体地说,您将拥有一个包含4个公共字段的
User
表和2个继承表,每个表都有自己的字段,这似乎就是您要寻找的内容。您可以使用多态关联(为什么要求反向多态实现?)或序列化属性
序列化属性
您可以添加带有文本类型的gender\u details
列,然后序列化此属性。然后定义女性和男性属性
# user.rb
class User < ActiveRecord::Base
MALE_DETAILS = %w[sports cars]
FEMALE_DETAILS = %w[perfume flowers]
serialize :gender_details, Hash
(MALE_DETAILS + FEMALE_DETAILS).each do |attr|
define_method attr do
self.gender_details ||= {}
self.gender_details[attr.to_sym]
end
define_method "#{attr}=" do |value|
self.gender_details ||= {}
self.gender_details[attr.to_sym] = value
end
end
end
我相信是单表继承解决了这个问题。我认为@SteveRoss是正确的。应该是单表继承。STI可能不是解决方案。@Steve Ross,我不同意,有了STI,每个字段都会在同一个表中,而不是MTIIn在给定的情况下,问题是一般情况下是一个人,男性和女性之间的专业化(可以假设)字段更少。我相信OP中的例子是为了问题的目的而简化的。然而,STI只在少数字段发生变化的情况下工作,您不介意有额外的字段存在;如果某些封装的属性是公共的,而其他属性是变化的,则多态性更好。我不是说MTI是错的;只是已经有两种Rails方法可以解决这些问题。它们是否有相同数量的“不同”字段?您只想根据性别区分标签?不,男性用户可能有4个额外的唯一字段,而女性用户有2个额外的唯一字段。不过,您仍然处于MTI的精确配置中,如果您不想直接实现这一点,有一个简单的gem模拟其行为:。