2017-12-12 1 views
3

であるかどうかを確認するための正しい方法は、私は、このようなコードをしました:レコードが私の見解ではActiveRecordのコレクション

<% if @posts.any? %> 
    <% @posts.each do |post| %> 
    ... 
    <% end %> 
<% else %> 
    <p>No posts found</p> 
<% end %> 

この私のコンソールログに生成されますので、

... 
Post Exists (1.4ms) SELECT 1 AS one FROM `posts` LIMIT 1 OFFSET 0 
... 
Post Load (1.1ms) SELECT `posts`.* FROM `posts` LIMIT 50 OFFSET 0 
... 

これをDB上で2つのクエリをトリガします。私はこのように表示を変更した場合

<% unless @posts.blank? %> 
    <% @posts.each do |post| %> 
    ... 
    <% end %> 
<% else %> 
    <p>No posts found</p> 
<% end %> 

一つだけのクエリがトリガされます。

... 
Post Load (1.1ms) SELECT `posts`.* FROM `posts` LIMIT 50 OFFSET 0 
... 

私は@posts.blank?または@posts.present?私が行って、私が使用している場合、私は、2つのクエリを実行@posts.exists?または@posts.empty?または@posts.any?を使用している場合1つのクエリのみ。

私の質問です。コレクションが空であるかどうかを確認するためのベストプラクティスがありますか?私はexists?empty?any?present?およびblank?を使用する必要がありますか? (プリロードレコードの)これをチェックした後

+1

グレート質問です。このように条件を考えたことはありません。あなたは「プレゼント」と何を共有してもいいですか? 1つのクエリまたは2つの 'any 'のようなものは私がチェックしたが、今は自分のPCにはないだろう。 – Aakanksha

+0

'存在?' '空白のように動作します?' – Pioz

+1

は、あなたが私たちに正しいログを示していますか?第1のコードは、第2のコードが 'games'を使用するときに' posts'からデータをロードします。 – MrShemek

答えて

1

が存在しますか?それがすべての中で最も速いので使用する必要があります。

@post.blank? would retrieve all the post and count them. 

[email protected]? would retrieve all the post and count them. 

@post.empty? would retrieve the count of post. 

ブランク?、プレゼント?、空?レコードをあらかじめロードしておけば使いやすいです。

@post.any? would be exactly the same as the previous option. 

any?リレーション内のレコードを取得し(プリロードされていない限り)、配列として表現してから呼び出します。常にデータベースに照会し、プリロードされたレコードに依存することはなく、1つのレコードだけが取得されるため、この方法はどの方法よりも高速になります。

@post.exists? would retrieve the first post. That makes this approach fastest among those five. 
+0

は、私は質問の例では、私が使用している場合ので、 '存在する同意しない?'私は '存在を使用している場合、私は代わりに、2つのクエリを実行する?'私は唯一のクエリを実行し、私はこれが速く、大きなデシベルと実際のアプリで、多くのだと思います接続されたクライアント...私はあなたの考えを知ってみましょう... – Pioz

+0

@ MrShemekも存在することを示していますか?時間がかかりません。スコープがデータベースからの結果を返すかどうかを確認するだけならば、それが存在するのでしょうか?より良い選択肢です。プレゼントは?私たちは存在を確認するためにすべての投稿を読み込みます。そして存在する?投稿を読み込む代わりにカウントを使用し、それも1に制限されます。 –

0

私は、次のような結果を持っている:

  • は、追加のクエリを生成します。

    • exists?(0.3ms)
    • empty?(0.3ms)
    • any?(0.4ms)
    • 追加のクエリを生成する方法の群において

      • blank?

    present?除くこれらの全て:(0.5ミリ秒)

  • は、追加のクエリを生成しません(exists?,empty?,any?,present?)は、t彼は次のクエリ:あなたは本当にクエリの数を減らしたい場合は

    SELECT `posts`.* FROM `posts` 
    

    ので、blank?を使用します。

    SELECT 1 AS one FROM `posts` LIMIT 1 
    

    のみpresent?は、別のクエリを(それは少し時間がかかります)を生成します。他の場合は、いずれの方法も使用できますが、私はpresent?を避けることを推奨します。

  • +0

    イム私の場合、追加のクエリを生成しない '存在?'方法。私は新しいレール5.1.4アプリで二重チェックしました。 – Pioz

    +0

    私はRails 5.1.4も使用しています。 [ドキュメント](http://api.rubyonrails.org/v5.1.4/classes/Object.html#method-i-present-3F)によると、私は '.presentと言うでしょう?'は、追加を生成してはなりません(なぜなら '!blank?')ですが、ログには何か違うものが表示されます。 – MrShemek

    関連する問題