0

データベース検索を Rails のインスタンス変数に割り当てると、その変数への今後のリクエストがデータベースにもヒットするのはなぜですか? これは回避できますか?

たとえば、ユーザー、リソース、オピニオンの 3 つのモデルがあり、オピニオンには has_many :through があります

@opinions = current_user.opinions # pulls in all of the user's opinions, which include respective resource ids
1. resource_id を直接呼び出しても、データベースにはヒットしません。
@opinions.each do |opinion|
  opinion.resource_id  # does not hit the database (as expected)
end
2. クエリを実行するとデータベースにヒットします (変数が割り当てられていても):
@opinions.find_by_resource_id(1) # DOES hit the database

#2 がデータベースにヒットするのはなぜですか? データベースにアクセスせずに同じ検索を実行する方法はありますか?

情報はすでに @opinions 変数に含まれているため、db 呼び出しは必要ないようです。

4

1 に答える 1

0

配列に他に何も必要ない場合は@opinions、元のクエリをスコープして、その意見のみを含めるようにしますresource_id

@opinions = current_user.opinions.where("resource_id = ?", resource_id)

特定のキー/値に一致するオブジェクトの新しい配列を既に持っていて@opinions、単に作成したい場合:

@opinions_with_resource_id = @opinions.select { |opinion| opinion.resource_id == 1234 }

別の説明について、または回答を複数の配列に分割する場合は、この他の回答を確認してください。

考え

最後のコードにコメントする

あなたが呼び出したようなメソッドは、データベースをヒットし、* で指定された列の内部を調べるためにfind_by_*使用する動的ファインダーです。method_missing

前の回答からの残りのコメント

このオブジェクトが Resource モデルのデータにアクセスする必要がある場合は、メソッドを忘れないでください#includes()。これにより、後で追加のクエリを実行する必要がなくなります。

@opinions = current_user.opinions.includes(:resources)

http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associationsを参照してください。

于 2012-09-28T21:26:02.390 に答える