我有以下模型:游戏和挑选。 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