1

設置的has_many我有3個車型通過關聯

class Battle < ActiveRecord::Base 
    has_many :battle_videos 
    has_many :videos, :through => :battle_videos 
    ... 
end 


class BattleVideo < ActiveRecord::Base 
    belongs_to :battle 
    belongs_to :video 
    validates :code, :presence => true 
end 

class Video < ActiveRecord::Base 
    belongs_to :user, :foreign_key => :user_id, :class_name => "User" 
    ... 
end 

BattleVideo具有屬性 「代碼」(left_side || right_side),其確定BATTLE側(總有2個邊在戰鬥中,怎麼總是打 - 1對陣1,球隊vs.球隊等)

我想在模型視頻中指定關聯(left_side_video,right_side_video),它可以獲得選定球隊的視頻。

我們獲得SIDE 1(左)視頻 - 使用此代碼

Battle.first.battle_videos.where("battle_videos.code = 'left_side'").first.video 

我想我的戰鬥視頻這樣

Battle.first.left_side_video 

我認爲,對戰模式應該是這樣的,但它不工作(僅適用左側)

class Battle < ActiveRecord::Base 
    has_many :battle_videos 
    has_many :videos, :through => :battle_videos 

    has_many :left_side_video, :through => :battle_videos, :source => :video, :conditions => ["battle_videos.code = 'left_side'"] 
    has_many :right_side_video, :through => :battle_videos, :source => :video, :conditions => ["battle_videos.code = 'right_side'"] 
end 

UPDATE: 工程,但不是以所需的方式。問題出在includes鏈上。 模型Battle具有範圍:all_inclusive,它加載的所有關聯

scope :all_inclusive, includes(:battle_category).includes(:bets).includes(:votes).includes(:left_side_video).includes(:right_side_video) 

生成的SQL:

Battle Load (0.6ms) SELECT `battles`.* FROM `battles` WHERE (battles.status = 1 AND valid_from < '2012-01-31 13:31:50' AND battles.valid_to > '2012-01-31 13:31:50') ORDER BY battles.id DESC 
BattleCategory Load (0.1ms) SELECT `battle_categories`.* FROM `battle_categories` WHERE `battle_categories`.`id` IN (1) 
Bet Load (0.1ms) SELECT `bets`.* FROM `bets` WHERE `bets`.`parent_type` = 'Battle' AND `bets`.`parent_id` IN (1, 2) 
Vote Load (0.2ms) SELECT `votes`.* FROM `votes` WHERE `votes`.`parent_type` = 'Battle' AND `votes`.`parent_id` IN (1, 2) 
BattleVideo Load (0.1ms) SELECT `battle_videos`.* FROM `battle_videos` WHERE `battle_videos`.`battle_id` IN (1, 2) AND (battle_videos.code = 'user_1') 
Video Load (0.1ms) SELECT `videos`.* FROM `videos` WHERE `videos`.`id` IN (1, 3) 

注意到視頻2和4(FOR右側) - 不負載。我只能訪問1,3-視頻

畫 ID,battle_id(側面)

[1,1(LFT)]

[2,1(RGT)]

[ 3,2(LFT)]

[4,2(RGT)]

當我刪除.includes(:right_side_video):all_inclusive鏈我得到這個SQL:

Battle Load (0.6ms) SELECT `battles`.* FROM `battles` WHERE (battles.status = 1 AND valid_from < '2012-01-31 13:39:26' AND battles.valid_to > '2012-01-31 13:39:26') ORDER BY battles.id DESC 
BattleCategory Load (0.1ms) SELECT `battle_categories`.* FROM `battle_categories` WHERE `battle_categories`.`id` IN (1) 
Bet Load (0.1ms) SELECT `bets`.* FROM `bets` WHERE `bets`.`parent_type` = 'Battle' AND `bets`.`parent_id` IN (1,2) 
Vote Load (0.2ms) SELECT `votes`.* FROM `votes` WHERE `votes`.`parent_type` = 'Battle' AND `votes`.`parent_id` IN (1,2) 
BattleVideo Load (0.3ms) SELECT `battle_videos`.* FROM `battle_videos` WHERE `battle_videos`.`battle_id` IN (1,2) AND (battle_videos.code = 'left_side') 
Video Load (0.1ms) SELECT `videos`.* FROM `videos` WHERE `videos`.`id` IN (1, 3) 
Video Load (0.2ms) SELECT `videos`.* FROM `videos` INNER JOIN `battle_videos` ON `videos`.`id` = `battle_videos`.`video_id` WHERE `battle_videos`.`battle_id` = 1 AND (battle_videos.code = 'right_side') LIMIT 1 
Video Load (0.1ms) SELECT `videos`.* FROM `videos` INNER JOIN `battle_videos` ON `videos`.`id` = `battle_videos`.`video_id` WHERE `battle_videos`.`battle_id` = 2 AND (battle_videos.code = 'right_side') LIMIT 1 

現在,這工作正常。但是,在SQL級別 - 它不像我想要的那麼完美。你可以看到,視頻1,3加載正確的方式

Video Load (0.1ms) SELECT `videos`.* FROM `videos` WHERE `videos`.`id` IN (1, 3) 

但視頻2,4負載由單獨的sql語句:

Video Load (0.2ms) SELECT `videos`.* FROM `videos` INNER JOIN `battle_videos` ON `videos`.`id` = `battle_videos`.`video_id` WHERE `battle_videos`.`battle_id` = 1 AND (battle_videos.code = 'right_side') LIMIT 1 
Video Load (0.1ms) SELECT `videos`.* FROM `videos` INNER JOIN `battle_videos` ON `videos`.`id` = `battle_videos`.`video_id` WHERE `battle_videos`.`battle_id` = 2 AND (battle_videos.code = 'right_side') LIMIT 1 

我想要什麼? 生成者RUBY

Video Load (0.1ms) SELECT `videos`.* FROM `videos` WHERE `videos`.`id` IN (1, 2, 3, 4) 
+0

所以,你想獲得所有視頻加載Rails在一個請求什麼代碼?這:'battle.videos.left_side'不可接受? – 2012-01-31 13:56:57

+0

是的。請求 - 所有視頻 – 2012-01-31 14:01:25

+0

left_side | right_side'code'存儲在assoc模型中'BattleVideo'不在型號'Video'中 – 2012-01-31 14:02:56

回答

0

最終的SQL你爲什麼不嘗試用「加入」,而不是「包括」?

你可以這樣

named_scope : left_side_video, { 
     :select => "videos.*", 
     :joins => "INNER JOIN battle_videos ON battle_videos.video_id = videos.id INNER JOIN battles on battles.id = battle_videos.battle_id", 
     :conditions=>"battle_videos.code = 'left_side'" 
    } 

創建named_scope沒有測試呢。但完美的查詢應該或多或少是類似的。

0

我認爲,您應該使用preload而不是includes來加載關聯。

範圍:包容各方的,預緊(:battle_category,:賭注,:票,:left_side_video,:right_side_video)

preload不影響原來的查詢,它使您可以指定每個協會單獨的查詢。

它在rails 3.0.x中很好用。不知道你使用哪個版本,它可能會有所不同...

+0

不工作(我corret方式..預加載相同作爲包括 – 2012-01-31 21:10:26