我目前有两个Rails模型如下:
class Job < ApplicationRecord
has_many :job_interests
end
class JobInterest < ApplicationRecord
belongs_to :job
belongs_to :applicant
enum status: { pending: 0, accepted: 1, rejected: 2, cancelled: 3 }
end
我正在尝试为特定的申请人(用户)实现这一点,我可以提供工作列表。每个作业应与一个或零个JobInterest实例相关联(针对该特定用户)。
我已经想到了实现这一目标的多种方法,但看起来有点麻烦。
可能的解决方案1:
基本上使用LEFT OUTER JOIN,例如
Job.includes(:job_interests).where(job_interests: { applicant_id: [current_applicant.id, nil] }).all
这会产生一个作业列表,每个作业都有一个名为job_interests
的属性,该属性应该有一个项目或者没有。一个如果申请人表示有兴趣,一个如果申请人没有表示感兴趣。
缺点:这似乎不是最简单的方法。
可能的解决方案2:
创建作业后,自动为属于此作业的所有申请人创建JobInterests。鉴于很多应用程序,它不能很好地扩展,并且需要大量额外的行。 另一方面,现在可以通过调用
获取作业列表 JobInterest.where(applicant_id: current_applicant.id).all
,这似乎比以前的方法更清洁。
你会选择这些方法中的任何一种,或者提出另一种我无法想到的方法。
答案 0 :(得分:1)
因此,基于我在您的问题中的评论,我认为它只是一个简单的has_many :through
关联。 User
有很多工作机会,Job
有很多感兴趣的人Users
。
class JobInterest < ApplicationRecord
belongs_to :user
belongs_to :Job
end
class User < ApplicationRecord
has_many :jobinterests, dependent: :destroy
has_many :jobs, :through => :jobinterests
end
class Job < ApplicationRecord
has_many :jobinterests, dependent: :destroy
has_many :users, :through => :jobinterests
end
通过这种方式,您可以在查看作业时简单地向作业兴趣添加作业,并在用户选择退出作业时将其从列表中删除。