ご存知のように、スコープは呼び出し時にロードを開始します。だからこの表現
articles = Article.published
articles.newest
2 つのクエリを取得します。はい、私たちはこれを行うことができます
articles = Article.published.newest
しかし、条件が必要な場合はどうすればよいですか? foo == bar の場合、チェーンを続行します。
ご存知のように、スコープは呼び出し時にロードを開始します。だからこの表現
articles = Article.published
articles.newest
2 つのクエリを取得します。はい、私たちはこれを行うことができます
articles = Article.published.newest
しかし、条件が必要な場合はどうすればよいですか? foo == bar の場合、チェーンを続行します。
あなたは間違っています。あなたの例では、2行:
articles = Article.published
articles.newest
これにより、2 つのクエリが生成されることはありません。連鎖を続けることができる理由は、これらの呼び出しが を返すためActiveRecord::Relation
です。これは、トラバーサルでクエリを実行するか、count、sum、またはその他の集計メソッドなどの他のいくつかのメソッド呼び出しを選択するだけです。
これをコンソールから見ている場合、各行がクエリを生成しているように見えます。これは、コンソールでは、inspect
すべての評価の後に呼び出される暗黙的な呼び出しがあり、クエリが生成されるためです。
以下のようにすることができます:
articles = foo == bar ? Article.published.newest : Article.published
同じテーブル内の条件?
@a = Article.where("published = true AND foo = bar").order("publishing_date desc").limit(1)
複数のテーブルで一括読み込みが必要な場合は、includes(...)
メソッドを使用します。