Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 不同用户类型的Rails关联_Ruby On Rails_Database - Fatal编程技术网

Ruby on rails 不同用户类型的Rails关联

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

我有一个用户模型,并希望将个人资料信息附加到它特定于性别

除了保存性别中立数据的用户模型(如下图所示)之外,我是否应该有一个FemaleProfile&MaleProfile模型

用户模型:

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模拟其行为:。