什么时候执行 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 查询的 spawn
ed 副本。
您对 meet1
所做的操作会触发对数据库的实际命中。我怀疑像 p meet1
甚至您的 IRB shell 这样无害的东西可能会将 spawn
ed 潜在数据库查询评估为 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
方法,这会让你对方法更加清楚。
我对 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 查询的 spawn
ed 副本。
您对 meet1
所做的操作会触发对数据库的实际命中。我怀疑像 p meet1
甚至您的 IRB shell 这样无害的东西可能会将 spawn
ed 潜在数据库查询评估为 Enumeration
,然后它会访问数据库。
我也想让你看看this answer
when you call
User.all
it returnsUser::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
方法,这会让你对方法更加清楚。