2012-05-17 161 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