2011-04-01 10 views
5

मैं टूर्नामेंट के लिए रेल आवेदन पर काम कर रहा हूं। मैं तीन मॉडलों इस क्वेरी पर साथ काम कर im हैरेल 3 एक क्वेरी में एकाधिक टेबल सहित

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" 

tournaments_controller के शो कार्रवाई में, im निम्न क्वेरी बुला:

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

टूर्नामेंट और player_matches एक एकल में किया जाता है में शामिल होने के खिलाड़ियों को व्यक्तिगत रूप से पूछे जाते हैं के बाद से मेरी कोड उन पर निर्भर करता है:

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 

कैसे मैं इस अप बदल सकते हैं, इतना है कि यह सब एक क्वेरी में खींच लिया जाता है?

+0

इस टिप्पणी को एक टिप्पणी के रूप में टॉस करना कुछ ऐसा ही मेरी एन + 1 समस्या तय करता है, लेकिन मुझे यकीन नहीं है कि यह आपके लिए काम करेगा या नहीं। यदि आप अपना 'शामिल' कॉल बदलते हैं तो इसमें क्या मिलता है '(: player_matches =>: players)'? –

+0

इसके अलावा, इसे बाहर निकालना ... सुनिश्चित करें कि आप उत्पादन मोड में उपयोग किए गए एसक्यूएल को देख रहे हैं, विकास नहीं। –

+0

अभी तक उत्पादन मोड में इसे चलाने के लिए नहीं है। यह आउटपुट टर्मिनल में सर्वर कंसोल से है, जैसा लॉग के रूप में माना जाता है, इसलिए मुझे पता है कि मेरे पास सही आउटपुट है :)। – agmcleod

उत्तर

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

यह चाल चलाना चाहिए। और वास्तव में, सरणी नोटेशन और हैश नोटेशन का संयोजन पहले क्रमबद्ध करने के लिए थोड़ा गन्दा है, लेकिन कंसोल के साथ काम करता है और आपको पता चलेगा कि कौन सा सिंटैक्स क्रैश नहीं होता है :)

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे अभी भी कई खिलाड़ी प्रश्न वापस आ रहे हैं हालांकि :(मुझे आश्चर्य है कि शायद मेरी समस्या यह है कि मैं डेटा का उपयोग कैसे कर रहा हूं, या मेरे पास डीबी संरचित कैसे है। – agmcleod

संबंधित मुद्दे