Почему ActiveRecord не получает эти агрегированные функции получения

#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 ) Я только что провел быстрый тест, и хотя инспектор объектов не распечатывает агрегированные поля, они есть, и вызов их метода возвращает правильное значение.