我正在写一个activerecord连接查询,但它没有工作。
我有这两个类
class User
belongs_to :store, required: true
end
class Store < ActiveRecord::Base
has_many :users, dependent: :nullify
has_one :manager, -> { where role: User.roles[:manager] }, class_name: 'User'
end
我需要在没有经理的情况下与经理和所有商店一起获得所有商店。
我写了这两个查询
Store.includes(:users).where('users.role <> ?', User.roles[:manager]).references(:users).count
Store.includes(:users).where('users.role = ?', User.roles[:manager]).references(:users).count
,结果是
2.2.1 :294 > Store.includes(:users).where('users.role <> ?', User.roles[:manager]).references(:users).count
(6.6ms) SELECT COUNT(DISTINCT "stores"."id") FROM "stores" LEFT OUTER JOIN "users" ON "users"."store_id" = "stores"."id" WHERE (users.role <> 1)
=> 201
2.2.1 :295 > Store.includes(:users).where('users.role = ?', User.roles[:manager]).references(:users).count
(4.0ms) SELECT COUNT(DISTINCT "stores"."id") FROM "stores" LEFT OUTER JOIN "users" ON "users"."store_id" = "stores"."id" WHERE (users.role = 1)
=> 217
现在我知道我有219家商店,并且正在使用
with_manager = 0
without_manager = 0
Store.all.each do |s|
if s.manager.present?
with_manager = with_manager +1
else
without_manager = without_manager +1
end
end
我也知道我有217家店经理和2家店没有经理。一个查询正在运行,第二个(没有经理的商店)失败。
所以我必须修复查询,但我无法理解如何解决它...
答案 0 :(得分:0)
通常我会使用以下内容,与经理一起获得商店:
Store.includes(:manager).where(users: { id: nil })
联接将使用内连接,而不是包含大小写的左连接。
在相反的情况下,这很棘手,但我这样做:
def decimal_helper(row, column):
return row - 1, column -1
# unpack the tuple back into two variables
row, column = decimal_helper(row, column)
这是与经理的左连接,并且在没有包含用户的情况下获得所有商店。