我有一个Rails7项目,在那里我有一些桌子

Pipelines

class Pipeline < ApplicationRecord
  has_many :states, inverse_of: :pipeline, dependent: :destroy  
end

States

class State < ApplicationRecord
  belongs_to :pipeline, inverse_of: :states 
  has_many :items, inverse_of: :state
end

Items

class Item < ApplicationRecord
  belongs_to :state, inverse_of: :items
end

我编写了一个查询,以仅限制州上的特定项目

@pipeline = Pipeline.joins(states: :items)
                    .where(states: { items: { name: "Lorem" } })
                    .find_by(id: '123')

帖子主题:回复:

Pipeline Load (0.7ms)  SELECT "pipelines".* FROM "pipelines" INNER JOIN "states" ON "states"."pipeline_id" = "pipelines"."id" INNER JOIN "items" ON "items"."state_id" = "states"."id" WHERE "items"."name" = $1 AND "pipelines"."id" = $2 LIMIT $3  [["name", "Lotem"], ["id", "123"], ["LIMIT", 1]]

但是,一旦我从管道调用状态,它就会无限制地生成新的查询:

puts @pipeline.states.inspect

State Load (0.4ms)  SELECT "states".* FROM "states" WHERE "states"."pipeline_id" = $1 /* loading for inspect */ LIMIT $2  [["pipeline_id", "123"], ["LIMIT", 11]]

我期望它应该从它已经加载的集合中获取状态, 我错过了什么吗?

推荐答案

但是,一旦我从管道调用状态,它就会生成新的查询,而不会 限制

是的,joins就是这样工作的,它不会做更多的事情,所以doctor 甚至不会费心添加更多的信息.如果您想要访问单个查询中的州(实际上,它最终将是2个查询),您可以使用includes

ActiveRecord::QueryMethods#includes个;

指定要包括在结果集中的关系.它可以让你 访问用户模型的地址属性而不触发 其他查询.

并且您的查询将略微更改为;

Pipeline
  .includes(states: :items)
  .where(items: { name: "Lorem" })
  .find('123')

在一个管道实例上调用states会生成一个新的查询,这是因为您正在对该对象调用一个实例方法,而根据定义,该方法会生成一个新的查询.除非另行指定(通过使用定制select子句或类似的方式),否则活动记录不会知道您引用的是查询中已创建的内容.


告示

Pipeline.joins(states: :items).where(items: { name: "Lorem" })Pipeline.joins(states: :items).where(states: { items: { name: "Lorem" } })相同,您不需要在州下嵌套项.

Ruby相关问答推荐

ruby 中嵌套哈希中相同键的平均值

从同名方法调用 ruby​​ 中的方法

数组切片中没有左边框的Ruby范围

如何使用 define_method 指定方法默认参数?

Ruby 的 .() 运算符是如何工作的?

在 Ruby 中生成一个后台进程

删除 Ruby 数组中的 nil 和空白字符串

class_eval <<-"end_eval", __FILE__, __LINE__ 在 Ruby 中是什么意思?

Ruby 1.9 - 无效的多字节字符(US-ASCII)

Ruby注入初始为哈希

计算文件中的行数而不将整个文件读入内存?

如何在 Ruby 的 IRB 中启用自动完成

在 Ruby 脚本中解析命令行参数

Ruby 中的 each 和 collect 方法有什么不同

Ruby 是否有像栈、队列、链表、映射或集合这样的容器?

以小时为单位的时差

如何使用 Ruby-Rails 删除文件夹的所有内容?

如何在 Ruby 中实现回调?

传递块时 Array#sort 如何工作?

查找两个数组的共同点