#ruby-on-rails #activerecord
#ruby-on-rails #activerecord
Вопрос:
Выполнение запроса с агрегатными функциями непосредственно в ActiveRecord с Postgres, похоже, работает нормально.
ActiveRecord::Base.connection.execute("
SELECT created_at::date as date,
sum(item1_count) as sum_item1,
sum(item2_count) as sum_item2,
sum(item3) as sum_item3 from items
GROUP by
created_at::date ORDER BY date desc").to_a
И возвращает что-то вроде этого, что нормально.
[
{
"date" => "2014-01-23",
"sum_item1" => "3239",
"sum_item2" => "90",
"sum_item3" => "0.00000"
},
{
"date" => "2014-01-22",
"sum_item1" => "1981",
"sum_item2" => "19",
"sum_item3" => "0.00000"
}
]
Проблема заключается в том, что при попытке сделать то же самое, используя области видимости, например.
class Item < ActiveRecord::Base
scope :myscope, -> {
select("created_at::date as date, sum(item1_count) as sum_item1,
sum(item2_count) as sum_item2,
sum(item3) as sum_item3")
.group("created_at::date")
.order("date desc") }
end
Результат здесь другой. При запуске user.items.myscope.to_a
я получаю следующий результат, в котором отсутствуют агрегированные значения и добавляется поле id, которого там не должно быть.
[
#<Item:0x00000103cc3d38> {
:id => nil,
:date => Thu, 23 Jan 2014
},
#<Item:0x00000103cc39a0> {
:id => nil,
:date => Wed, 22 Jan 2014
}
]
Как можно было бы передать агрегированные функции в область видимости?
Комментарии:
1. Возможно, я ошибаюсь, но я помню, что приходилось заключать имена агрегированных полей в кавычки, НАПРИМЕР
select("sum(item1_count) as 'sum_item1'")
2. Пробовал это, но, похоже, это не имеет значения.
3. Вы пробовали на самом деле вызывать агрегированный метод для объекта, чтобы проверить, существует ли он? (Например
Item.first.sum_item2
) Я только что провел быстрый тест, и хотя инспектор объектов не распечатывает агрегированные поля, они есть, и вызов их метода возвращает правильное значение.