2010-02-16 34 views
10

Khi tôi sử dụng bí danh cột trong truy vấn với find_by_sql, nó dường như không được đặt trong đối tượng kết quả, ngay cả khi tôi thêm attr_accessor cho thuộc tính.Đường ray: đặt thuộc tính bí danh cột với 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 

tôi mong chờ để có thể làm điều này:

countries = Country.sorted_by_average_score.first.average_score 

... nhưng nó luôn luôn trả về nil, mặc dù một giá trị được dứt khoát trở về từ truy vấn.

Có ai có thể giải thích cho tôi tại sao thuộc tính không được đặt trong đối tượng không?

Trả lời

13

Bạn không cần sử dụng attr_accessor, xem lời giải thích của neutrino. Bạn chỉ cần truy cập cột ảo của mình bằng cách sử dụng hàm băm attributes. Câu hỏi này giống như câu hỏi Rails: find_by_sql and virtual column. Mã mẫu cho ví dụ của bạn:

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

Cảm ơn ScottD.I đã có cùng một vấn đề và điều này giải quyết nó. – Tam

5

attr_accessors không có gì liên quan đến cách ActiveRecord xử lý các cột của bạn. Tôi đã hiển thị nó trong this question. Về cơ bản tất cả những thứ đang diễn ra trong công cụ tìm kiếm chạm vào cột, hoạt động với hàm băm attributes, không phải với các biến mẫu mà người truy cập của bạn khai báo.

chỉnh sửa: thực sự câu trả lời của tôi không trả lời hoàn toàn câu hỏi. nó chỉ giải thích tại sao attr_accessor không thể giúp được gì ở đây. mong được thấy ai đó làm phần còn lại của công việc :)

+0

Mặc dù câu trả lời đúng của bạn không trả lời được câu hỏi thực tế, nhưng bạn nên biết điều gì đang xảy ra dưới mui xe. Cảm ơn. – Saim

Các vấn đề liên quan