使用'includes'的ActiveRecord查询有时会应用default_scope,有时则不会

时间:2016-08-08 22:22:36

标签: ruby-on-rails activerecord ruby-on-rails-3.2 rails-activerecord default-scope

我正在尝试在我的用户模型上执行ActiveRecord查询,该模型使用includes来加载用户的角色和位置。 (用户有很多角色并且有很多位置) Location模型具有默认范围。它是:

where(:status => [0, 2])

当我使用includes执行简单查询时,将应用位置模型的默认范围。例如,查询:

User.includes(:roles, :locations)

将在sql输出中包含以下内容:

SELECT "locations".*, "t0"."user_id" AS ar_association_key_name FROM "locations" INNER JOIN "locations_users" "t0" ON "locations"."id" = "t0"."location_id" WHERE "locations"."status" IN (0, 2)

然而,稍微复杂一点的查询,例如:

User.includes(:roles, :locations).where(roles: {id: 13})

不应用位置默认范围。状态为1的地点将包含在用户返回的位置中。

我注意到第一个查询是使用多个SELECT语句执行的,而第二个查询是作为一个SELECT语句执行的,其中包含许多JOIN个语句。如何在所有情况下应用default_scope?

我使用的是Rails 3.2.22。

0 个答案:

没有答案