Rails:使用find_by_sql设置列别名属性

chr*_*phe 12 sql activerecord ruby-on-rails

当我在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
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这一点:

countries = Country.sorted_by_average_score.first.average_score
Run Code Online (Sandbox Code Playgroud)

...但它总是返回nil,即使从查询中确实返回了一个值.

任何人都可以向我解释为什么没有在对象中设置属性?

sco*_*ttd 13

您不需要使用attr_accessor,请参阅中微子的解释.您只需使用attributes哈希访问您的虚拟列.这个问题与Rails相同:find_by_sql和虚拟列.示例的示例代码:

countries = Country.sorted_by_average_score.first.attributes['average_score']
Run Code Online (Sandbox Code Playgroud)


ale*_*dev 5

因为attr_accessors与ActiveRecord处理列的方式无关.我已经在这个问题中展示了它.基本上所有接触列的finder中发生的事情都与attributes哈希一起工作,而不是你的访问者声明的实例变量.

编辑:实际上我的答案并没有完全回答这个问题.它只是解释了为什么attr_accessor在这里没有任何帮助.期待看到有人完成剩下的工作:)