मैं टूर्नामेंट के लिए रेल आवेदन पर काम कर रहा हूं। मैं तीन मॉडलों इस क्वेरी पर साथ काम कर 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
कैसे मैं इस अप बदल सकते हैं, इतना है कि यह सब एक क्वेरी में खींच लिया जाता है?
इस टिप्पणी को एक टिप्पणी के रूप में टॉस करना कुछ ऐसा ही मेरी एन + 1 समस्या तय करता है, लेकिन मुझे यकीन नहीं है कि यह आपके लिए काम करेगा या नहीं। यदि आप अपना 'शामिल' कॉल बदलते हैं तो इसमें क्या मिलता है '(: player_matches =>: players)'? –
इसके अलावा, इसे बाहर निकालना ... सुनिश्चित करें कि आप उत्पादन मोड में उपयोग किए गए एसक्यूएल को देख रहे हैं, विकास नहीं। –
अभी तक उत्पादन मोड में इसे चलाने के लिए नहीं है। यह आउटपुट टर्मिनल में सर्वर कंसोल से है, जैसा लॉग के रूप में माना जाता है, इसलिए मुझे पता है कि मेरे पास सही आउटपुट है :)। – agmcleod