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
và
@players = Player.filter_by_country('USA').order_by_prize('desc')
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'? –
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. –
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 :) –