【问题标题】:Filter ActiveRecord records by nested resource logic - Rails按嵌套资源逻辑过滤 ActiveRecord 记录 - Rails
【发布时间】:2016-09-24 06:10:02
【问题描述】:

我正在 Rails 中构建一个任务列表应用程序,它允许用户创建包含任务的任务列表。我正在尝试设置过滤,以便仅显示所有任务都标记为完成的任务列表。

目前:

列表型号:
class List < ActiveRecord::Base
  belongs_to :user
  has_many :tasks
end
任务模型:
class Task < ActiveRecord::Base
  belongs_to :list

  def completed?
    !completed_at.blank?
  end
end

据我了解,ActiveRecord 的 .where 查询方法只查看该模型的字段及其值(例如:@lists.where(name: "List Name")

有没有人知道类似下面伪代码的方法:

@completed_lists = @lists.where(list.tasks.completed.count == list.tasks.count)

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby activerecord filter


    【解决方案1】:

    您可以使用它来加载所有没有未完成任务的列表:

    List.where.not(id: Task.where('completed_at IS NULL').pluck('DISTINCT list_id'))
    

    【讨论】:

    • 它将提供给 postgresql 上的GroupingError。我在另一个示例中对其进行了测试:(
    • Writing group('lists.id, tasks.id') 接受关于 pg 的查询,但我不确定它是否正常工作。您对此有何看法?
    • 我改了答案
    【解决方案2】:

    尝试使用List.all.map{|list| list if list.tasks.completed.count == list.tasks.count}

    【讨论】:

    • 您的解决方案提供给 n+1。
    • 感谢您的回答,除了结果是数组而不是 ActiveRecord 关系之外,它的效果很好。有没有办法将其转换回 ActiveRecord 关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多