2012-05-10 21 views
5

Tôi có cơ sở dữ liệu với 6500 players và mỗi người chơi có trung bình 15 trò chơi results.Người chơi đặt hàng trên SUM của mô hình liên kết của họ

Sử dụng trường hợp

Tôi muốn tạo ra một danh sách các cầu thủ, sắp xếp theo các tổng tiền giải của họ (một lĩnh vực trong bảng kết quả). tôi thích điều này là trong một số loại phạm vi, vì vậy tôi cũng có thể lọc danh sách vào quốc gia của người chơi vv

Performance

Tôi đã thấy bài viết có đề cập đến một lĩnh vực cache_counter cho hiệu suất. Trong trường hợp của tôi Tôi có hàng ngàn hồ sơ kết quả (75.000+) vì vậy tôi không muốn tính toán được thực hiện mỗi khi có ai đó truy cập danh sách được tạo.

Câu hỏi

mô hình tốt nhất để giải quyết việc này là gì? Và làm thế nào để tôi thực hiện nó?

Models

class Player < ActiveRecord::Base 
    has_many :results 
end 

class Result < ActiveRecord::Base 
    belongs_to :player 
end 

Schemas

create_table "players", :force => true do |t| 
    t.string "name" 
    t.string "nationality" 
    end 

    create_table "results", :force => true do |t| 
    t.integer "player_id" 
    t.date  "event_date" 
    t.integer "place" 
    t.integer "prize" 
    end 

Cập nhật

Những gì tôi đang cố gắng để đạt được là nhận được đến một điểm mà tôi có thể sử dụng:

@players = Player.order_by_prize 

@players = Player.filter_by_country('USA').order_by_prize('desc') 

Trả lời

10

Bạn sẽ có thể sử dụng một cái gì đó như thế này:

class Player 
scope :order_by_prize, joins(:results).select('name, sum(results.prize) as total_prize').order('total_prize desc') 

Tham khảo ray api - active record querying để biết chi tiết.

+4

Tôi phải thực hiện một số điều chỉnh đối với đề xuất của bạn và bây giờ nó đặt hàng chính xác cho họ bằng tổng số giải thưởng của họ: 'scope: order_by_prize, join (: results) .select ('players.id, players.name, sum (results) .p ('players.id'). order ('total_prize desc') '. Tuy nhiên, kết quả chỉ hiển thị 'player.id' và' player.name', không phải kết quả 'total_prize'? –

+0

Btw, tôi đã thực hiện những điều chỉnh vì tôi đang sử dụng PostgreSQL và trong giao diện điều khiển, nó đã nói với tôi để bao gồm một nhóm theo mệnh đề sau khi chạy mã của bạn. –

+0

Nevermind! Trong giao diện điều khiển, 'total_prize' không hiển thị trên màn hình trong đầu ra kết quả, nhưng thuộc tính được đặt chính xác và có sẵn. Cảm ơn bạn rất nhiều :) –

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