我有两个ruby类,Jobs和Listings。
列出属性:src/MyNamespace
,job_id
,live_date
工作属性:is_active
,title
,description
如果我想从单个类别中检索2个作业的详细信息,其中关联的列表实时日期是最近的2个并且列表处于活动状态,那么我可以使用有效的一行Ruby ?
目前我正在考虑多次循环,我想可能会有更有效的方法。
所需输出
两个作业结果,其中列表处于活动状态且live_dates是最新的。 (在这种情况下,一个工作只会有一个有效的列表。)
category
答案 0 :(得分:3)
我相信你应该可以使用以下内容。它未经测试,因此可能需要调整一两个,但应该返回您要求的两个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)
返回前两个记录,在这种情况下是由于订单到位所需的记录答案 1 :(得分:0)
如果我理解您的要求,您需要获得整个职位类别的两个最新列表,而不仅仅是单个职位的最新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