Rails: установка атрибута псевдонима столбца с помощью find_by_sql

Когда я использую псевдоним столбца в запросе с помощью find_by_sql, он не кажется установленным в объектах результата, даже когда я добавляю attr_accessor для этого свойства.

class Country < ActiveRecord::Base

  attr_accessor :average_score

  def self.sorted_by_average_score
    sql = "SELECT country_id, AVG(score) AS average_score, countries.name " +
    "FROM players " +
    "INNER JOIN countries ON players.country_id = countries.id " +
    "GROUP BY country_id "
    Country.find_by_sql(sql)
  end
end

Я бы ожидал, что смогу это сделать:

countries = Country.sorted_by_average_score.first.average_score

... но он всегда возвращает nil, даже если значение определенно возвращается из запроса.

Может ли кто-нибудь объяснить мне, почему атрибут не задан в объекте?

Ответ 1

Вам не нужно использовать attr_accessor, см. описание нейтрино. Вам просто нужно получить доступ к вашему виртуальному столбцу, используя хэш attributes. Этот вопрос такой же, как Rails: find_by_sql и виртуальный столбец. Пример кода для вашего примера:

countries = Country.sorted_by_average_score.first.attributes['average_score']

Ответ 2

Потому что attr_accessors не имеет никакого отношения к тому, как ActiveRecord обрабатывает ваши столбцы. Я показал это в этом вопросе. В основном все, что происходит в искателях, затрагивающих столбцы, работает с хешем attributes, а не с переменными экземпляра, которые объявляют ваши аксессоры.

edit: на самом деле мой ответ не полностью отвечает на вопрос. это просто объясняет, почему attr_accessor здесь не может быть никакой помощи. с нетерпением жду, чтобы кто-то оставил работу:)