【问题标题】:Rails join query based on associated records column value基于关联记录列值的Rails连接查询
【发布时间】:2020-03-16 09:51:12
【问题描述】:

我有两个模型:

项目

attributes: id, status (open, cancelled, reopened)
has_many: todos 

待办事项

attributes: id, project_id, status (done, partially_done, pending)
belongs_to: project

我必须使用标签:DonePending 在这两个标签中,我必须根据关联的待办事项状态显示项目。

Project.all.includes(:todos).where(todos: {status: ['done', 'partially_done']})

它将返回项目,其中关联的待办事项处于完成/部分完成状态。

假设:我有两个项目:

Project 1 -> Todo 1 (done), Todo 2 (partially_done), Todo 3 (pending)
Project 2 -> Todo 4 (done), Todo 5 (partially_done), Todo 6 (done)

done 标签中:它只会显示项目 2(因为所有待办事项都已完成或部分完成)

pending 选项卡中,它将仅显示项目 1(因为一个待办事项仍处于待处理状态)

如何根据待办事项过滤项目?

我可以这样做:

pending_projects = Project.joins(:todos).select{|project| project.todos.any?(&:pending?)}

但这似乎很耗时。有什么方法可以有效地做到这一点?

提前致谢!

【问题讨论】:

    标签: ruby ruby-on-rails-5 rails-activerecord


    【解决方案1】:

    你可以这样做:

    pending_projects = Project.joins(:todos).where(todos: { status: :pending })
    

    这样您就可以将查找正确记录的所有工作交给数据库引擎,这是正确的。

    【讨论】:

    • 它是否会将项目返回为待处理,其中至少有一个待办事项处于待处理状态?
    • 是的,它会这样做。
    • 我可以这样做吗? Project.joins(:todos).where(todos: { status: :pending && status: ![:done, :partially_done]})
    • 你可以改用where.not()
    • pending_projects = Project.joins(:todos).where(todos: { status: :pending }).where.not(todos: {status: [:done, :partially_done]})
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多