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
здесь не может быть никакой помощи. с нетерпением жду, чтобы кто-то оставил работу:)