繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM