2012-05-17 98 views
1

我试图做这样的事情来预加载所有数据,所以我不必在每次循环运行时都进行数据库调用。在Ruby on Rails中预加载数据库中的数据

# Get all data and do some eager loading 
bets = Bet.find(:all, :include => :team_id) 

games = Game.find(:all) 

games.each do |game| 
    bets.find_all_by_user_id(user.id) # Now I want to get the specific bets, but I can't do find() on the returned array 
end 

,我已经试过

bets = Bet.where(:user_id => users) # users are an array of ID's 

games = Game.find(:all) 

games.each do |game| 
    bets.find_all_by_user_id(user.id) # This works, but it makes a db call every time, which makes the site really slow. 
end 

所以基本上我想要做的是加载所有数据,然后在循环中使用它,而无需连接数据库的其他方式。什么是最好的方法呢?

+0

在给出任何建议之前,您确实必须提供有关应用程序体系结构的更多信息。它是网络吗?移动?窗体形式?如何通过Web服务设计DAL? – dexter

回答

2

您可能必须在之前的某个点进行调用,将数据保存在变量中,然后在循环中访问该变量。这样的事情:

games = Game.all 

bets = Bet.all 

games.each do |game| 
    bets.select {|b| b.user_id == user.id} 
end 

不要在数组中使用finder方法:如果你这样做,你会再次查询数据库。坚持使用Ruby enumerable methods来处理已有的数据。

1

我不确定你想要做什么...你在哪里得到用户变量。为什么你需要在每场比赛中显示全部投注?所以,我希望你的赌注属于用户并发布到某个游戏。你需要列出用户参加过的每场比赛的所有投注?所以,用户应该是:

has_many :bets  
has_many :games, :through => :bets 

现在:

user.games.all(:include => :bets).each do |game| 
    game.bets # will be already loaded 
end 

这里: :包括 - 应该沿着加载名称关联。所命名的符号引用已定义的关联。 - 引用Rails API