20

次のようにクエリを作成しようとしています。

rel = article.where(version: 'some_version')
             .joins(:categories)
             .merge(Category.where(:uuid => 'some_cat_uuid'))

articles = rel.where(published: true).limit(10)
# etc.

問題は、最初のクエリが何をしても実行されるように見えることです。私は何か間違ったことをしていますか?

4

1 に答える 1

36

コンソールでコマンドを実行する.inspectと、最後に のようなものが自動的に追加され、コマンドの結果が表示されます。たとえば(これは私が現在取り組んでいる私のアプリにあります):

irb(main):061:0> Job.where(id: 251000)
  Job Load (3.8ms)  SELECT "jobs".* FROM "jobs" WHERE "jobs"."deleted_at" IS NULL AND "jobs"."id" = 251000
=> [#<Job id: 251000, {...}>]

したがって、コードの最初の行は問題なく、通常はクエリを実行しませんが、コンソールで実行していたため、結果を表示できるようにすぐに実行されます。

これを回避する 1 つの方法は、コマンドの最後に追加; nilすることです。これにより、コンソールは結果を表示しようとしません (その行の結果として nil を表示するだけです。IE:

irb(main):062:0> Job.where(id: 251000); nil
=> nil

このようにすると、期待どおりのことができるはずです (実際に結果が必要になるまでクエリの実行を遅らせます)。

rel = article.where(version: 'some_version')
             .joins(:categories)
             .merge(Category.where(:uuid => 'some_cat_uuid')); nil

articles = rel.where(published: true).limit(10); nil

articles.all次に、 (Rails 3の場合)またはarticles.to_a(Rails 4の場合)を使用してクエリを実行できます

もちろん、このコードをレーキ タスクやモデルなどに移動する場合は、それらの; nilビットを削除できます。

コンソールのもう 1 つの論点は、その時点でそれを確認し.where() {NEWLINE}てクエリを実行することです。コマンドが終了する場所のあいまいさを取り除くために、前の行にドットを配置する傾向があります。

rel = article.where(version: 'some_version').
             joins(:categories).
             merge(Category.where(:uuid => 'some_cat_uuid')); nil
于 2013-07-03T19:28:29.417 に答える