![](/img/trans.png)
[英]ActiveRecord, has_many :through, and Polymorphic Associations
[英]Polymorphic has_many through Associations in 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
这有点粗糙,但我想你会明白这个想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.