当我在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,即使从查询中确实返回了一个值。
有人可以向我解释为什么没有在对象中设置属性吗?
答案 0 :(得分:13)
您不需要使用attr_accessor
,请参阅中微子的解释。您只需使用attributes
哈希访问您的虚拟列。这个问题与Rails: find_by_sql and virtual column相同。示例的示例代码:
countries = Country.sorted_by_average_score.first.attributes['average_score']
答案 1 :(得分:5)
因为attr_accessors
与ActiveRecord处理列的方式无关。我已经在this question中展示了它。基本上所有接触列的finder中发生的事情都与attributes
哈希一起使用,而不是你的访问者声明的实例变量。
编辑:实际上我的答案并没有完全回答这个问题。它只是解释了为什么attr_accessor
在这里没有任何帮助。期待看到有人完成剩下的工作:)