2011-04-01 26 views
5

Turnuvalar için bir ray uygulaması üzerinde çalışıyorum. Üç modelleri bu sorguyu ile çalışan im var: tournaments_controller şov eylemi olarakRaylar 3 Bir sorguda birden fazla tablo var.

class Player < ActiveRecord::Base 
    validates :name, :uniqueness => true 
    has_and_belongs_to_many :tournaments 

class Tournament < ActiveRecord::Base 
    belongs_to :tournament_type 
    has_and_belongs_to_many :players 
    has_many :player_matches, :dependent => :destroy 

class PlayerMatch < ActiveRecord::Base 
    belongs_to :player_one, :class_name => "Player", :foreign_key => "player_one" 
    belongs_to :player_two, :class_name => "Player", :foreign_key => "player_two" 

, im aşağıdaki sorguyu çağırarak: turnuvalar ve player_matches tek yapılan ederken

Tournament.where(:id => params[:id]).includes(:player_matches, :players).first() 

katılmak

Player Load (0.4ms) SELECT `players`.*, t0.tournament_id as the_parent_record_id FROM `players` INNER JOIN `players_tournaments` t0 ON `players`.id = t0.player_id WHERE (t0.tournament_id = 14) 
Player Load (0.2ms) SELECT `players`.* FROM `players` WHERE `players`.`id` = 5 LIMIT 1 
Player Load (0.2ms) SELECT `players`.* FROM `players` WHERE `players`.`id` = 9 LIMIT 1 
Player Load (0.2ms) SELECT `players`.* FROM `players` WHERE `players`.`id` = 1 LIMIT 1 
Player Load (0.1ms) SELECT `players`.* FROM `players` WHERE `players`.`id` = 8 LIMIT 1 
Player Load (0.1ms) SELECT `players`.* FROM `players` WHERE `players`.`id` = 3 LIMIT 1 
Player Load (0.1ms) SELECT `players`.* FROM `players` WHERE `players`.`id` = 2 LIMIT 1 
Player Load (0.1ms) SELECT `players`.* FROM `players` WHERE `players`.`id` = 7 LIMIT 1 
Player Load (0.1ms) SELECT `players`.* FROM `players` WHERE `players`.`id` = 6 LIMIT 1 
Player Load (0.1ms) SELECT `players`.* FROM `players` WHERE `players`.`id` = 4 LIMIT 1 

hepsi bir sorguda çekilebilecek şekilde Nasıl bu kadar değiştirebilirsiniz: kodum onlara bağlı olduğu için, oyuncular, ayrı ayrı sorgulanan?

+0

savurma bunu çökmez hangi sözdizimi öğreneceğim elde etmektir benzer bir şey N + 1 sorunumu çözdü, ancak sizin için çalışıp çalışmadığından emin değilim. 'Includes' çağrınızı değiştirirseniz (: player_matches =>: players) 'a ne olur? –

+0

Ayrıca, bunu dışarı atmak ... geliştirme modunda değil, üretim modunda kullanılan SQL'i aradığınızdan emin olun. –

+0

Bunu üretim modunda çalıştırmamıştım. Bu çıktı, sunucu konsolundan, günlüklerde olduğu gibi, konsoldan geliyor, bu yüzden doğru çıktıya sahip olduğumu biliyorum :). – agmcleod

cevap

10
Tournament.where(:id => params[:id]).includes([{:player_matches => :player_one}, :players]).first() 

Bu hile yapmalıdır. Ve gerçekten, Dizi açıklamasında ve karma gösterimde kombinasyonu dağınık biraz ilk başta sınıflandırılır ancak konsol ile çalışmak ve yana bir yorum olarak :)

+0

Yanıt için teşekkürler. Yine de birden fazla oyuncu sorgusu geri geliyorum :(. Belki de benim sorunum, verileri nasıl kullandığım ya da db yapılıma nasıl sahip olduğum ile ilgili olabilir. – agmcleod

İlgili konular