Rails关联用于不同的用户类型

时间:2013-02-07 20:54:22

标签: ruby-on-rails database

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

我应该有一个女性档案& MaleProfile模型除了保存性别中性数据的用户模型外,如下图所示?

用户模型:

has_one :FemaleProfile
has_one :MaleProfile

Fields :Name, :Age

FemaleProfile模型:

belongs_to :User

Fields :Name, :Age, :Dress_Color

MaleProfile模型:

belongs_to :User

Fields :Name, :Age, :Tie_Color

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

是否存在反向多态关系?我已经看过STI,但它不允许继承模型专用的字段。

2 个答案:

答案 0 :(得分:1)

我会考虑在这个cas中使用Multi Table Inheritance。我个人使用citier gem来实现这个:http://inspiredpixel.net/citier/

具体而言,您将拥有一个包含4个公共字段的User表和2个继承的表,每个表都有自己的字段,这似乎就是您所寻找的。

答案 1 :(得分: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'
相关问题