按子属性Ruby on Rails选择并订购父记录

时间:2018-06-07 15:23:40

标签: ruby-on-rails ruby ruby-on-rails-4

我有两个ruby类,Jobs和Listings。

列出属性:src/MyNamespacejob_idlive_date

工作属性:is_activetitledescription

如果我想从单个类别中检索2个作业的详细信息,其中关联的列表实时日期是最近的2个并且列表处于活动状态,那么我可以使用有效的一行Ruby ?

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

所需输出

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

category

2 个答案:

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