通过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
这有点粗糙,但我想你会明白这个想法。