2013-08-26 25 views
6

Tôi đã có một truy vấn thực hiện một số phép toán và trả về trường chọn tùy chỉnh được tính toán với tập kết quả. Tôi không thể tìm ra cách truy cập nó trong đối tượng activerecord được trả về. Tôi cũng đã thêm attr_accessor cho nó.trả lại truy vấn tùy chỉnh chọn trong activerecord

attr_accessor :percentage_used 

select('gateways.*, (num_transactions_today/ SUM(num_transactions_today)) AS percentage_used ').joins(:gateway_groups).where('map_gateway_groups.gateway_group_id = ?', gateway_group_id) 

trong tập kết quả, tôi hy vọng sẽ có quyền truy cập vào: percent_used, nhưng không có trong đó. Bất kỳ ý tưởng về những gì tôi đang làm sai? Tôi chưa bao giờ cần phải làm điều này trước đây.

Cảm ơn

Trả lời

9

Bạn có thể truy cập vào nó như

object["percentage_used"] 
4

Bạn không cần và cũng không muốn attr_accessor cho điều đó. attr_accessor tạo một biến mẫu, một phương thức truy nhập để nhận giá trị của biến cá thể đó và một phương thức biến đổi để thay đổi giá trị của nó. Khi bạn nói điều này:

select('gateways.*, (num_transactions_today/ SUM(num_transactions_today)) AS percentage_used ... 

ActiveRecord sẽ tự động thêm phương thức percentage_used vào đối tượng được trả về. Nhưng phương pháp percentage_used để truy cập vào giá trị đó sẽ được thêm bởi method_missing. Vì bạn đã nói attr_accessor :percentage_used, method_missing sẽ không bao giờ được gọi và bạn không thể nhận được giá trị percentage_used từ truy vấn theo cách thông thường.

Nếu bạn thả attr_accessor :percentage_used, thì bạn sẽ có thể gọi percentage_used trên các đối tượng được trả về bởi số select đó và bạn sẽ tìm thấy các giá trị bạn đang tìm kiếm. Tuy nhiên, AR sẽ không thể chuyển đổi giá trị thành số gốc của Ruby mặc dù vậy bạn sẽ phải tự trả lại số to_f.

+0

Một bài học tuyệt vời khác của bạn. :-) –

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