2010-02-16 14 views
10

Cuando uso un alias de columna en una consulta con find_by_sql, no parece estar establecido en los objetos de resultados, incluso cuando agrego un attr_accessor para la propiedad.Rieles: establecimiento del atributo de alias de columna con find_by_sql

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 

Yo esperaría que ser capaz de hacer esto:

countries = Country.sorted_by_average_score.first.average_score 

... pero siempre devuelve nil, a pesar de que un valor es, sin duda regresó de la consulta.

¿Alguien me puede explicar por qué el atributo no está establecido en el objeto?

Respuesta

13

No necesita usar attr_accessor, consulte la explicación del neutrino. Solo necesita acceder a su columna virtual utilizando el hash attributes. Esta pregunta es la misma que Rails: find_by_sql and virtual column. Código de ejemplo para su ejemplo:

countries = Country.sorted_by_average_score.first.attributes['average_score'] 
+0

Gracias ScottD.Tengo el mismo problema y esto lo resuelve. – Tam

5

Porque attr_accessors no tienen nada que ver con la forma en que ActiveRecord trata sus columnas. Lo he mostrado en this question. Básicamente, todo lo que sucede en los buscadores que toca columnas, funciona con el hash attributes, no con las variables de instancia que declaran sus descriptores.

editar: en realidad mi respuesta no responde la pregunta por completo. simplemente explica por qué attr_accessor no podría ser de ninguna ayuda aquí. esperando ver a alguien hacer el resto del trabajo :)

+0

Aunque es correcto que su respuesta no responda a la pregunta real, pero es bueno saber qué está sucediendo bajo el capó. Gracias. – Saim

Cuestiones relacionadas