您如何对协会应用限制和订购?

时间:2015-05-15 14:20:16

标签: ruby-on-rails ruby activerecord

我正在尝试创建一个可以执行以下操作的查询,

Category has_many Dates

  • 查询需要一个位置和一个类别
  • 提供一系列类别,按类别中的作业数量排序。为此,我在default_scope { order(jobs_count: :desc) }模型中使用Category,其中jobs_count是一个计数器。

在每个类别中,查询提供一系列作业

  • 作业按布尔关联属性order.featured排序,然后按日期排序(order belongs_to job
  • 仅显示具有属性open: true的作业。这可以通过范围来完成。
  • 如果存在位置,则仅显示位置附近的作业。这需要调用Class方法Job.within()
  • 如果未设置任何类别,则仅显示20。这证明非常困难。

这可以在3次调用数据库时使用吗?

尝试解决方案

在较高的层面上,我首先找到找到正确区域中的作业,其属性为open: true

如果我需要每个类别只显示20个作业,我会使用ruby的group_by按类别对作业进行分组,尝试正确排序,然后删除除每个数组中前20个以外的所有作业。

我拿这些工作的ID。

我使用Category.includes(:jobs).where(jobs: { id: job_ids})对Category表执行数据库调用。默认范围确保订单正确。

然而,我陷入了最后的障碍!我似乎无法订购以这种方式回来的工作。 default_scope似乎被忽略,我不知道如何将订单或范围应用于Category查询中调用的作业。

这是解决问题的正确方法吗?有没有更简单的方法? Jobs.group_by(...)会更好 - 它似乎需要在ruby文档中传递原始SQL:http://guides.rubyonrails.org/active_record_querying.html#group

0 个答案:

没有答案