1

すべてのデータをプリロードするためにこのようなことをしようとしているので、ループが実行されるたびにデータベースを呼び出す必要はありません。

# 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

つまり、基本的に私がやろうとしているのは、すべてのデータをロードし、データベースに接続することなくループで使用することです。これに対する最善のアプローチは何ですか?

4

2 に答える 2

2

おそらく、前の時点で呼び出しを行い、データを変数に保存してから、ループ内でその変数にアクセスする必要があります。このようなもの:

games = Game.all

bets = Bet.all

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

配列内でファインダー メソッドを使用しないでください。使用すると、データベースに再度クエリを実行することになります。Ruby の列挙可能なメソッドを使用して、既に持っているデータを操作します。

于 2012-05-17T15:30:32.347 に答える
1

何をしようとしているのかわかりません...ユーザー変数はどこで取得しましたか。なぜ各ゲームですべての賭けを表示する必要があったのですか?だから、私はあなたの賭けがユーザーに属し、いくつかのゲームに投稿されることを望んでいます。そして、ユーザーが参加した各ゲームのすべてのベットをリストする必要がありますか?したがって、ユーザーは次のようになります。

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

そして今:

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

ここで:: include-一緒にロードする必要がある関連付けに名前を付けます。名前の付いた記号は、すでに定義されている関連付けを示しています。--RailsAPIからの引用。

于 2012-05-17T15:58:18.510 に答える