什么时候执行 ActiveRecord 查询?

When is an ActiveRecord query executed?

我对 Ruby 如何执行查询感到困惑:

假设我们有两种方法:

def meet1
   user = User.all
end

每次调用此方法时,我都会收到一个查询 运行,其中显示:

'User Load (18.3ms) SELECT "users".* FROM "users" INNER JOIN "roles" ON "roles"."user_id" = "users"."id" WHERE "users"."banned" = 'f' AND "roles"."description" = 'gogetter''

表示查询用户...

假设我有另一种方法:

def meet2
  user = User.all
  user.to_sql
end

当我调用它时,它返回给我该查询的 SQL 格式:

所以我的问题是在第一种方法中执行了查询,但是在第二种方法中执行了查询吗?或者它只是向我显示最终结果而不执行查询,因为我从未使用过它?

user = User.all 除了创建一个潜在的查询之外什么都不做,spawn 将其复制到 user。这遵循 "Builder Pattern"; user 然后可以说 user.joins(...)user.order(...) 来构建不同的潜在查询。他们都是 return 查询的 spawned 副本。

您对 meet1 所做的操作会触发对数据库的实际命中。我怀疑像 p meet1 甚至您的 IRB shell 这样无害的东西可能会将 spawned 潜在数据库查询评估为 Enumeration,然后它会访问数据库。

我也想让你看看this answer

when you call User.all it returns User::ActiveRecord_Relation object, and by itself this object does not issue a database query. It's where you use this object that matters.

所以当 meet1 被调用时它发出查询但是在 meet2 的情况下 User.all 发出关系对象并且 user.to_sql 发出与数据库相关的查询。

当您尝试根据条件链接多个过滤器时,您会看到同样的事情发生

u = User.all
u = u.where(name: "Hello") if any_condition?
u = u.where(last_name: 'world') if any_other_condition?

在这种情况下 any_condition?和 any_other_condition?是真的,它只执行一个查询合并所有 3 件事 .all 和所有 where 条件。

我想让你看看blog here它显示了一些kickers方法,这会让你对方法更加清楚。