通过Ruby on Rails中的关联进行多态化

我有以下问题,用户可以有多个职业,超过10个。例如,用户可能是医生,教师和N.每个职业都有自己的属性。 我可以,Doctor belongs_to User,但是如果我想知道这个用户的所有职业,我将不得不检查User表的每一行。

我创建了以下代码

class User < ApplicationRecord has_many :jobables end class Job < ApplicationRecord belongs_to :user belongs_to :jobable end class Jobable < ApplicationRecord has_one :job end class Medic < Jobable end class Programmer < Jobable end 

但我不知道这是否是最好的答案

我认为这样做会更容易:

 class User < ApplicationRecord has_many :user_professions has_many :professions, through: :user_professions end # == Schema Information # # Table name: professions # # id :integer not null, primary key # name :string # created_at :datetime not null # updated_at :datetime not null # class Profession < ApplicationRecord has_many :user_professions has_many :users, through: :user_professions end class UserProfession < ApplicationRecord belongs_to :user belongs_to :profession end 

然后,您可以创建逻辑以确保Profession仅被分配给User一次。

然后,你可以简单地做:

 @user.professions 

并为User获得所有Profession

你也可以这样做:

 @profession.users 

并获得属于Profession所有User

基于对您的问题的编辑,您可以执行以下操作:

 class UserProfession < ApplicationRecord belongs_to :user belongs_to :profession belongs_to :profession_detail, polymorphic: true end 

在这种情况下,您可能会遇到以下情况:

 class DoctorDetail < ApplicationRecord end 

你可以这样做:

 @user.professional_detail_for(:doctor) 

当然,您需要在User模型上实现professional_detail_for方法,该方法可能类似于:

 class User < ApplicationRecord has_many :user_professions has_many :professions, through: :user_professions def professional_detail_for(profession_type) user_profession_for(profession_for(profession_type)).try(:profession_detail) end private def profession_for(profession_type) Profession.find_by(name: profession_type.to_s) end def user_profession_for(profession) user_professions.find_by(profession: profession) end end 

这有点粗糙,但我想你会明白这个想法。