我有以下具有这些关系的模型
项目有_许多任务
任务有_many TodoItems
我想执行一个搜索,它只返回项目,其中所有任务的所有 TodoItems 都标记为已完成
我尝试通过 :tasks 添加到项目 has_many :todo_items
然后这样做
projects = Projects.joins(:todo_items).where(todo_items: {done: true})
但这会返回一些待办事项已完成的项目,而我只想要所有待办事项都已标记为已完成的项目
最佳答案
首先,你需要同时加入tasks和todo_items:
projects = Projects.joins(tasks: :todo_items)
然后说说条件: 我不知道,在 Activerecord 语法中是否可行,所以我会想到 SQL。
如果是一次性操作,我会像这样在 ruby 中进行迭代:
# not production code, very expensive
projects = Projects.joins(tasks: todo_items).all.select { |project| project.tasks.any? { |task| task.todo_items.all?(&:done) } }
如果你需要经常调用它,我会创建缓存:
rails g migration AddAllDoneToTasks all_done:boolean{null: false}
class Task
before_save :set_all_done
def set_all_done
self.all_done = todo_items.all?(&:done)
end
end
class TodoItem
belongs_to :task, touch: true
end
那么搜索就很简单了:
Projects.joins(:tasks).where.not(all_done: false)
关于ruby-on-rails - 如何仅查找所有孙子都符合 Rails 中某些条件的祖 parent 记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759731/