Select 并在 Rails 上按子属性 Ruby 对父记录进行排序
Select and order parent record by child attribute Ruby on Rails
我有两个 ruby 类,职位和列表。
列表属性:job_id
、live_date
、is_active
职位属性:title
、description
、category
如果我想从一个类别中检索 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
我有两个 ruby 类,职位和列表。
列表属性:job_id
、live_date
、is_active
职位属性:title
、description
、category
如果我想从一个类别中检索 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 的 where
子句允许您通过传递指定为值 的散列来查询 first(2)
returns 前两条记录,在本例中是由于订单到位而需要的记录
ORDER BY
元素
jobs
以及关联的 listings
如果我对您的要求理解正确,您需要获取整个职位类别的两个最新列表,而不仅仅是单个职位的最新 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