Направляющие: установка столбца искажает атрибут с 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

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

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

12
задан Lance Roberts 22 February 2010 в 17:14
поделиться

2 ответа

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

countries = Country.sorted_by_average_score.first.attributes['average_score']
13
ответ дан 2 December 2019 в 19:31
поделиться

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

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

5
ответ дан 2 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: