Выберите запрос, когда группировка с ActiveRecord не работает - PullRequest
0 голосов
/ 28 октября 2018

У меня есть следующий запрос в моем бэкэнде:

@books = Book.select("city, sum(rating)").group("city")

Таблица в базе данных выглядит следующим образом:

  create_table "books", force: :cascade do |t|
    t.string "title"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "author_id"
    t.integer "rating"
    t.string "city"
    t.index ["author_id"], name: "index_books_on_author_id"
  end

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

#<ActiveRecord::Relation [#<Book id: nil, city: "barcelona">, #<Book id: nil, city: "madrid">]>

Я использую sqlite, просто чтобы попрактиковаться в AR.

В sqlite команда, которую я бы использовал, показывает ожидаемые результаты:

sqlite> SELECT city, sum(rating) FROM books GROUP BY city;
city        sum(rating)
----------  -----------
barcelona   11         
madrid      10         
  • Почему я не вижу сумму рейтингов с ActiveRecord?
  • Почему я вижу идентификаторы, если я их не выбрал?

Большое спасибо

1 Ответ

0 голосов
/ 28 октября 2018

Вы видите идентификаторы, потому что inspect не идеально в ActiveRecord.

Вы не видите сумму оценок, потому что inspect не идеально в ActiveRecord.

Если вы добавите AS к вашему select:

@books = Book.select("city, sum(rating) AS rating_sum").group("city")
# => #<ActiveRecord::Relation [#<Book id: nil, city: "barcelona">, #<Book id: nil, city: "madrid">]>
@books.first.rating_sum
# => 11

, вы сможете вызвать .rating_sum для каждого из возвращенных элементов, но вы все равно не увидите сумму в вашемконсоль при проверке элемента.

В этом случае вы также можете получить доступ к сумме, не используя AS, вызвав .sum для ваших результатов,

@books.first.sum

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

Как вы, наверное, заметили, идентификаторы, которые вы видите, являются нулевыми, потому что inspect для ActiveRecord всегдаотображает идентификатор модели, и так как ваш запрос не вернул его, ему ничего не назначено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...