用户特定结果的Rails模型设计

时间:2017-10-18 12:55:10

标签: ruby-on-rails database-design model ruby-on-rails-5 rails-activerecord

我目前有两个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 ,这似乎比以前的方法更清洁。

你会选择这些方法中的任何一种,或者提出另一种我无法想到的方法。

1 个答案:

答案 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

通过这种方式,您可以在查看作业时简单地向作业兴趣添加作业,并在用户选择退出作业时将其从列表中删除。