Rails: установка атрибута псевдонима столбца с помощью find_by_sql - PullRequest
12 голосов
/ 16 февраля 2010

Когда я использую псевдоним столбца в запросе с 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

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

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

Ответы [ 2 ]

13 голосов
/ 17 февраля 2010

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

countries = Country.sorted_by_average_score.first.attributes['average_score']
5 голосов
/ 16 февраля 2010

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

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

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