我有以下模型:遊戲和挑選。 Game和Pick之間有一對多的聯繫。還有第三種模式叫玩家,玩家有很多精選。Rails ActiveRecord幫手查找方法不急切加載關聯
Player類中有一個方法可以爲給定的遊戲找到一個選擇,或者如果它不存在就創建一個新的選擇。
class Player < ActiveRecord::Base
has_many :picks
def pick_for_game(game)
game_id = game.instance_of?(Game) ? game.id : game
picks.find_or_initialize_by_game_id(game_id)
end
end
我希望爲每個選秀節目熱切地加載遊戲。但是,如果我這樣做
picks.find_or_initialize_by_game_id(game_id, :include => :game)
它首先運行此查詢時獲取的選秀權(該方法被多次運行),然後取遊戲,因爲每個選秀被訪問。如果我一個default_scope添加到匹克類
class Pick < ActiveRecord::Base
belongs_to :game
belongs_to :player
default_scope :include => :game
end
它仍然會爲每個選擇2條SELECT語句,但現在它挑右後加載遊戲,但它仍然沒有做加盟像我期待。
Pick Load (0.2ms) SELECT "picks".* FROM "picks" WHERE "picks"."game_id" = 1 AND ("picks".player_id = 1) LIMIT 1
Game Load (0.4ms) SELECT "games".* FROM "games" WHERE ("games"."id" = 1)
你爲什麼期望它做一個連接?這不是你要告訴它做的。 – 2011-04-02 00:41:38
@Andrew,所以':include'和做連接不一樣?我來自NHibernate的背景,所以我期待它通過一個連接完成一個調用,並且迫切地加載關聯的實體。 – Vadim 2011-04-02 02:31:12