gpt4 book ai didi

ruby-on-rails - 通过 Ruby on Rails 中的关联实现多态 has_many

转载 作者:行者123 更新时间:2023-12-04 06:33:38 24 4
gpt4 key购买 nike

我有以下问题,
一个用户可以有多个职业,超过10个。例如,一个用户可能是医生、教师、N,每个职业都有自己的属性。
我可以做,Doctor Beings_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

并获得所有 Profession s 代表 User .

你也可以这样做:
@profession.users 

并获得所有 User s 属于 Profession .

根据对您问题的编辑,您可以执行以下操作:
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)

当然,您需要实现 professional_detail_for User上的方法模型可能看起来像:
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

这有点粗糙,但我想你明白了。

关于ruby-on-rails - 通过 Ruby on Rails 中的关联实现多态 has_many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50223669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com