我有一个用户模型,并希望将特定于性别的个人资料信息附加到其中。
我应该有一个女性档案& 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,但它不允许继承模型专用的字段。
答案 0 :(得分:1)
我会考虑在这个cas中使用Multi Table Inheritance
。我个人使用citier
gem来实现这个:http://inspiredpixel.net/citier/
具体而言,您将拥有一个包含4个公共字段的User
表和2个继承的表,每个表都有自己的字段,这似乎就是您所寻找的。 p>
答案 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'