0

Rails 3.2 を使用しており、ActiveRecord を使用してデータベースにクエリを実行しようとしています。Admin と Order の 2 つのアクティブ レコード モデルがあります。

class Admin < ActiveRecord::Base
  attr_accessible :email, :name
  has_many :orders
class Order < ActiveRecord::Base
  attr_accessible :operation
  belongs_to :admin

私の場合、 order.operation は注文タイプを表す文字列です。私は3つの列を与えるクエリを作成しようとしています:

admin.name, admin.orders.where(:operation => 'bonus').count, admin.orders.where(:operation => 'gift').count

単一のクエリに収まる方法はありますか?

編集済み:必要なものを取得するための生のSQLは次のとおりです。

SELECT t_a.admin_id_com, t_a.name, gb_f_f_gb_f_fi.bonus_count, gb_f_f_gb_f_fi.gifts_count 
FROM (
  SELECT f_fil.admin_id_gifts, f_fil.gifts_count, f_filt.admin_id_bonus, f_filt.bonus_count 
  FROM (
    SELECT admin_id as admin_id_gifts, count(distinct id) as gifts_count FROM orders WHERE operation = 'new gifts!' GROUP BY admin_id_gifts) 
  f_fil LEFT OUTER JOIN (
    SELECT admin_id as admin_id_bonus, count(distinct id) as bonus_count FROM orders WHERE operation = 'new bonuses!' GROUP BY admin_id_bonus) 
  f_filt ON (f_fil.admin_id_gifts = f_filt.admin_id_bonus)) 
gb_f_f_gb_f_fi LEFT OUTER JOIN (
  SELECT id AS admin_id_com, t_ad.name FROM admins t_ad) t_a ON (gb_f_f_gb_f_fi.admin_id_gifts = t_a.admin_id_com)

ActiveRecord を使用してそのようなクエリを構築することは可能ですか?

4

1 に答える 1

1

これを試して:

@admins   = Admin.joins(:orders).
                 select("admins.id, admins.name, orders.id, 
                          SUM((orders.operation = 'bonus')::integer) AS bonus_count, 
                          SUM((orders.operation = 'gift')::integer) AS gift_count ").
                 group("admins.id ")

# access each columns as
admin.name, admin.bonus_count, admin.gift_count

他のオプションは、熱心な読み込みを使用することです.2つのクエリを使用しますが、より高速になる可能性があります

@admins  = Admin.includes(:orders)

# in admin.rb
def orders_count(type)
  # Don't use where here as it would make a separate query instead of using eager loading records
   orders.select{|x| x.operation == type}.count
end 

# access each columns as
admin.name, admin.orders_count("bonus"), admin.orders_count("gift")
于 2013-10-04T16:08:38.607 に答える