ruby-on-rails - 如何仅查找所有孙子都符合 Rails 中某些条件的祖 parent 记录?

标签 ruby-on-rails activerecord

我有以下具有这些关系的模型

项目有_许多任务

任务有_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/

相关文章:

sql - Rails - 如何按 ID 范围选择所有记录

ruby-on-rails - 您将哪些部署目录用于 Rails 应用程序(部署到 debian 机器)?

ruby-on-rails - 将 Rails 升级到 6,出现阻塞主机错误

ruby-on-rails - Rails 中的多个 where 条件

ruby - Hstore 和 Rails

ruby-on-rails - 如何在方法中创建动态连接语句?

ruby-on-rails - 从另一个表中获取计数

ruby-on-rails - Redis 在控制台上工作,但在应用程序中失败

mysql - Rails 在 has_many :through relation 中创建数据

mysql - rails : using set_table_name to join across different databases on the same mysql server