0

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

除了保存性别中性数据的 User 模型之外,我是否应该有一个 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

我不明白这是否确实正确是用户具有男性或女性个人资料,但该关联具有与用户关联的两种类型的个人资料。

是否存在逆多态关系?我已经查看了 STI,但它不允许继承模型专有的字段。

4

2 回答 2

1

我会考虑在这种情况下使用Multi Table Inheritance. 我个人使用citiergem 来实现这个:http: //inspiredpixel.net/citier/

具体来说,您将有一个User包含 4 个公共字段的表和 2 个继承表,每个表都有自己的字段,这似乎是您要查找的内容。

于 2013-02-07T21:18:32.913 回答
0

您可以使用多态关联(为什么要要求反向多态实现?)或序列化属性。

序列化属性

你可以添加一个gender_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

所以你可以使用

user.sports = 'Basketball'
user.flower = 'Rose'
于 2013-02-08T14:25:57.450 回答