この ruby/rails 構造は、いつも私を困惑させます:
User.where(:name => "Thiago").limit(3).using(:slave_one)
これは左から右に実行する必要があるため、連続する呼び出しごとにレシーバーが設定されます。where
のインスタンスを返すUser クラスから始めますActiveRecord::Relation
。次にlimit
、そのインスタンスで が呼び出され、 の別のインスタンスが返されますActiveRecord::Relation
。次にusing
、そのインスタンスで呼び出されます (たまたまシャードが選択されます)。全体がオブジェクト内に SQL クエリを構築しているActiveRecord::Relation
と思います。私の質問は、「何がクエリの実際の実行をトリガーするのか」ということです。クエリをさらに変更する後続処理がチェーン内に存在する可能性があるため、チェーン内の特定の時点で実行することはできません。そのあともusing
追加のメソッドがチェーンに追加されているかどうかがわからないため、クエリはまだ実行できません。明らかに、構築後にクエリを実行しますが、クエリは実際にどのように呼び出されるのでしょうか?
ありがとう...チェーン内のメソッドの名前には「セマンティクス」があることがわかりました。作成中のクエリをさらに変更する人もいます。最後の 1 つだけが、データのフェッチが必要なタイプである可能性があります。