【问题标题】:Rails model design for user specific result针对用户特定结果的 Rails 模型设计
【发布时间】:2018-03-30 08:36:43
【问题描述】:

我目前有两个 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

我正在尝试为特定申请人(用户)实现这一目标,我可以提供一份工作列表。每个 Job 应与一个或零个 JobInterest 实例相关联(针对该特定用户)。

我想了多种方法来实现这一点,但似乎都有些麻烦。

可能的解决方案 1:

基本上使用左外连接,例如

Job.includes(:job_interests).where(job_interests: { applicant_id: [current_applicant.id, nil] }).all

这会产生一个作业列表,每个作业都有一个名为job_interests 的属性,该属性应该有一个项目或没有。如果申请人表示有兴趣,则有一个,如果申请人没有这样做,则没有。

缺点:这似乎不是最直接的方法。

可能的解决方案 2:

创建工作时,会自动为属于该工作的所有申请人创建 JobInterests。鉴于很多应用程序,这不能很好地扩展并且需要很多额外的行。 另一方面,现在可以通过调用获取 Job 列表

JobInterest.where(applicant_id: current_applicant.id).all ,这似乎比以前的方法干净得多。

您会选择这些方法中的任何一种,还是建议我没有想到的另一种方法。

【问题讨论】:

  • 所以你想要一份与申请人有相同工作兴趣(至少一个)的工作列表?
  • @BillyFerguson 不完全是,这里的 JobInterest 实例基本上意味着有人对某个职位(广告)感兴趣,基本上是对职位广告的回应。所以在我的客户(应用程序)中,我想基本上显示一个列表,其中包含申请人尚未申请的所有工作,以及他已经申请的工作
  • 那么与他们已经申请的工作有相同兴趣的工作?
  • @BillyFerguson 不完全是。假设我是一名申请人,我在我的应用程序中查看了一份工作。然后通过为该特定工作创建一个 JobInterest 实例来标记他对该工作感兴趣。例如。一个 Job 实例可以有多个 JobInterest,每个申请人一个。

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


【解决方案1】:

因此,根据我在您问题中的 cmets,我认为这只是一个简单的 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

这样,您可以在查看职位时简单地将职位添加到职位兴趣中,并在用户选择退出职位时将其从列表中删除。

【讨论】:

  • 感谢您的回答。那么,您是否建议,当我提供工作列表时,然后为那些尚未为该用户获得 JobInterest 的工作创建 JobInterest?
  • 是的,或者提供一份工作清单并允许申请人favorite 或指定对该工作的兴趣。所以不要将它们全部添加到兴趣中。只有他查看的那些或他点击喜欢的那些。我将把实现留给你。但这有意义吗?
  • 是的,所以显示一个列表,当用户进入详细视图时创建 JobInterest。感谢您的想法,我将等待其他答案,然后再将某些内容标记为“答案”。
  • 喜欢的话点个赞吧!我认为这是你所追求的最直接的方法。
  • 另一个考虑因素是,在我的应用程序中的所有工作列表中,我确实想以某种方式显示该工作已经被“收藏”(使用您的词汇)。但您可能只查看工作的 JobInterests 并为当前用户选择一个(例如 job.job_interests.where(user_id: 1).first))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多