2013-10-04 4 views
0

Я использую rails 3.2 и пытаюсь использовать ActiveRecord для запроса моей базы данных. У меня есть 2 модели ActiveRecord, администратора и порядок:Custom select on join table

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

В моем случае, order.operation является строка, представляющая тип заказа. Я пытаюсь построить запрос, который дает мне три столбца:

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) 

Можно ли Buid запрос типа, что с помощью ActiveRecord?

+0

Вы хотите агрегатные вычисления столбцов столбцов на основе (т.е. сгруппированных) столбца 'admin.name'? –

+0

Yep, .group (: admin_id) было бы хорошо, но это не та часть, с которой у меня проблемы. –

+0

Можете ли вы рассказать мне, с чем вы столкнулись (например, показать, что вы пробовали)? –

ответ

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 

Другой вариант заключается в использовании жадной загрузки, он будет использовать два запроса, но может быть быстрее

@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") 
+0

Я изменил 'SUM' на' COUNT', и он работает, но не так, как должен. Он учитывает все заказы как в 'bonus_count', так и в' gift_count'. Вот что я получил: 't.map {| a | [a.name, a.bonus_count, a.gift_count]} '-' [["test", "10", "10"]] ' –

+2

Неужели это не работает с' SUM'? 'count' не будет работать, поскольку он будет просто считать все заказы. Идея с 'sum' заключается в том, что' operations = bonus' равно 1, когда true и 0, когда false, поэтому суммирование должно рассчитываться только с помощью 'operation = bonus' – tihom

+0

Это не работает с суммой, по крайней мере, это не работает me on my heroku postgres = ( –