3

クエリを保存し、その上に構築して実行したいと思います。

たとえば、どういうわけか

query = Post.order('likes DESC') # buffer the query
query = query.limit(3) # add on top of it
query.run # run it - this is the wrong syntax fyi

これはできますか?正しい構文は何ですか?

PS。「バッファ」が正しい単語かどうかわかりません。間違っている場合は訂正してください。

ありがとう!

4

4 に答える 4

4

Rails 3でActiveRecordを使用してクエリを作成する場合、 Arelを使用するため、「バッファー」は必要ありません。ActiveRecord query = Post.order('likes DESC')::Relationのインスタンスを提供します。このオブジェクトにはクエリに関する情報が含まれていますが、実際のデータは含まれていません。データを取得するには、たとえばメソッドを呼び出すことができます.first.allこれが、railsフレームワーク(> = 3.0)がいわゆる「レイジー初期化」を実装する方法です。これは、ActiveRecord::Relationが一種のプロキシであることを意味します。データベースへの実際のクエリは、モデルの一部のフィールドを取得しようとしている場合(または、.allなどを使用してデータを強制的にロードする場合.first)にのみ実行されます.last。このアクションが実行されるまで、フィルタリング条件のチェーンを構築し、データベースを「妨害」しないようにしてください。コードは次のようになります。

query = Post.order('likes DESC') # ActiveRecord::Relation object with info about your query
query = query.limit(3) # adds more filtering options
@posts = query.all # here ActiveRecord takes data from the database

#239 ActiveRecord :: Relationshipウォークスルーでは、ActiveRecord::Relationについてより深く理解できます。

于 2012-10-24T11:37:58.020 に答える
3

ARELとRails3を使用している場合、これは自動的に行われます。ARELは、オプションをチェーンするときにクエリを.all作成し、他の方法でデータを呼び出したりアクセスを開始したりするとクエリを実行します。

于 2012-10-24T03:10:35.653 に答える
2

それがまさにActiveRecordの仕組みです。イテレータまたはその他の非ARメソッドにヒットすると、構築されたクエリを使用してデータベースを呼び出します。.inspectReturnキーを押した後に出力を表示するためにメソッドが呼び出されると思うので、コンソールでは少し異なります。

あなたが提案したことをするのは良いことです。

于 2012-10-24T03:10:55.113 に答える
0

メソッドを使用ActiveRecord::Relation#loadして、データベースヒットを強制できます。

https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-load

于 2019-06-10T06:53:20.697 に答える