Write和Activerecord连接查询

时间:2016-03-04 14:51:53

标签: ruby-on-rails postgresql activerecord

我正在写一个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家店没有经理。一个查询正在运行,第二个(没有经理的商店)失败。

所以我必须修复查询,但我无法理解如何解决它...

1 个答案:

答案 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)

这是与经理的左连接,并且在没有包含用户的情况下获得所有商店。