Select 并在 Rails 上按子属性 Ruby 对父记录进行排序

Select and order parent record by child attribute Ruby on Rails

我有两个 ruby 类,职位和列表。

列表属性:job_idlive_dateis_active

职位属性:titledescriptioncategory

如果我想从一个类别中检索 2 个工作的详细信息,其中相关列表的有效日期是最近的 2 个并且列表是活动的,是否有一个有效的 Ruby 单行,我可以用吗?

目前我正在考虑多次循环,我想可能有更有效的方法。

期望输出

列表同时处于活动状态且 live_dates 是最新的两个工作结果。 (在这种情况下,一份工作只会有 1 个有效列表。)

@jobs = [
  {
    title: 'Job Title',
    description: 'Job Description',
    category: 'marketing'
  },
  {
    title: 'Job Title',
    description: 'Job Description',
    category: 'marketing'
  }
]

我相信你应该可以使用以下内容。它未经测试,因此可能需要一两次调整,但应该 return 您要求的两个 jobs

Job.eager_load(:listings).order("listings.live_date DESC").where(category: "your category", listings: { active: true }).first(2)

分解:

  • eager_load 预加载您的列表,因此您可以在查询中使用它们。如果您不将它们用于其他用途,outer_joins 可能是更好的选择并且性能更高
  • order 将方向应用于生成的 SQL
  • ORDER BY 元素
  • where 子句允许您通过传递指定为值
  • 的散列来查询 jobs 以及关联的 listings
  • first(2) returns 前两条记录,在本例中是由于订单到位而需要的记录

如果我对您的要求理解正确,您需要获取整个职位类别的两个最新列表,而不仅仅是单个职位的最新 2 个列表?

就我而言,我总是喜欢在模型中封装与模型相关的逻辑(出于 DRY 和 MVC 的原因),所以通常我使用 scopes:

class Listing
  belongs_to :job

  scope :is_active, -> { where(is_active: true) }
  scope :ordered_by_live_date -> { order(live_date: desc }
end

class Job
  has_many :listings

  def most_recent_category_listings(limit)
    # If you just need the most recent listings of this job,
    # remove .include and .where and rename Listing to listings
    Listing.include(:jobs).where(jobs: {category: self.category}).is_active.ordered_by_live_date.limit limit
  end
end

注意:未经测试,我只是在脑海中写下这篇文章,暂时没有做任何事情Ruby