Rails4 - 子模型关联取决于父模型属性

时间:2015-02-24 08:59:24

标签: ruby-on-rails ruby-on-rails-4 model has-one

我有一个具有职业属性的用户模型。 假设用户可以是footballertennisman 当用户注册时,他选择职业,并可以稍后更改。

我的用户模型包含最常见的属性,例如姓名,地址,重量,联系人信息。 我想将其他特定属性存储在专用模型中,例如footballer_profile,tennissman_profiles

我不能使用多态,因为信息对于单个模型结构来说太不同了。

如何根据我的“User.occupation”属性向我的用户模型声明特定的has_one条件?

这是最好的方式吗? 谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

你可以写:

class User < ActiveRecord::Base

  enum occupation: [ :footballer, :tennissman ]

  self.occupations.each do |type| 
    has_one type, -> { where occupation: type }, class_name: "#{type.classify}_profile"
  end
  #..
end

请阅读#enum以了解其工作原理。只需记住,而您将声明属性 enum ,该属性必须是 整数 列。如果您不想使用 enum ,请使用常量。

class User < ActiveRecord::Base

  Types = [ :footballer , :tennissman ]

  Types.each do |type| 
    has_one type, -> { where occupation: type.to_s }, class_name: "#{type.classify}_profile"
  end
  #..
end

答案 1 :(得分:1)

听起来像是我的多态性案例。

class User < ActiveRecord::Base
  belongs_to :occupational_profile, polymorphic: true
end

class FootballerProfile < ActiveRecord::Base
  has_one :user, as: :occupational_profile
end

通过这种方式,您可以简单地为他们选择的职业建立和关联个人资料。