Rails ActiveRecordは、複数のクエリを使用せずに、どのように「where」句を連鎖させるのですか?
質問
私はRuby on Railsの素晴らしさを学んでいるPHP開発者です。私はActiveRecordが大好きで、とても興味深いことに気づきました。それは、ActiveRecordのメソッドが、クエリを実行するためにメソッドチェーンの終わりを検出する方法です。
@person = Person.where(name: 'Jason').where(age: 26)
# In my humble imagination I'd think that each where() executes a database query
# But in reality, it doesn't until the last method in the chain
この魔術はどのように働くのですか?
どのように解決するのですか?
この
where
メソッドは
ActiveRecord::Relation
オブジェクトを返し、それ自身はデータベースクエリを発行しません。それは
ここで
であり、このオブジェクトを使用することが重要なのです。
コンソールでは、おそらくこうなっているはずです。
@person = Person.where(name: "Jason")
そして blammo を実行すると、データベースクエリが発行され、Jasonという名前の全員の配列のようなものが返されます。やったね、Active Record!
しかし、次にこのようなことをします。
@person = Person.where(name: "Jason").where(age: 26)
そしてまた別のクエリを発行します。これは26歳のJasonと呼ばれる人たちに対するものです。 しかし、発行されるのは 1 クエリしか発行しないので、他のクエリはどこに行ったのでしょうか?
他の方が示唆されているように、この現象は
where
メソッドはプロキシオブジェクトを返します。実際にクエリを実行し、データセットを返すことは、それを要求されない限りありません。
を実行するとき
何でも
を実行すると、実行した結果のインスパイア版が出力されます。もしあなたが
1
と入力し、Enterキーを押すと
1
と表示されます。
1.inspect
は
1
. マジック!同じことが
"1"
. 他のさまざまなオブジェクトには
inspect
メソッドが定義されていないため、Ruby は
Object
を返す
おぞましい
のように
<Object#23adbf42560>
.
いちいち
ActiveRecord::Relation
オブジェクトは
inspect
メソッドが定義されているので、クエリが発生します。コンソールでクエリを書くと、IRB は
inspect
を呼び出し、ほとんど人間が読めるようなもの、つまりあなたが見ているようなArrayを出力します。
標準的な Ruby スクリプトでこれを発行していた場合、オブジェクトが検査されるまでクエリは実行されません (
inspect
を使って) 検査されるか、あるいは
each
を使うか、あるいは
to_a
メソッドが呼び出されます。
これら三つのうち一つでも起こるまでは、いくつでもチェーンして
where
ステートメントを好きなだけ連鎖させることができ、その後に
する
を呼び出します。
inspect
,
to_a
または
each
を付けると、最終的にそのクエリを実行します。
関連
-
[解決済み】Rails。Ruby on Railsの移行でデータベースカラムの名前を変更するにはどうすればよいですか?
-
[解決済み】TypeError: SymbolからIntegerへの暗黙の変換がない。
-
[解決済み】OS X Yosemite 10.10.5 で [Ruby on Rails] 5 をインストールすると extconf が失敗して終了コード 1 エラーになる。
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] RoRにおけるSpringサーバーの機能とは?
-
[解決済み] RubyとRailsの "Date.today "フォーマット
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある
-
[解決済み] Ruby on RailsのActiveRecordのマイグレーションで、長すぎるインデックス名を処理するには?
-
[解決済み] Railsです。ActiveRecordでデフォルト値を設定するにはどうすればよいですか?
-
[解決済み] Array Rails ActiveRecordで例外なくwhere IDを選択する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Rails: sudo "コマンドが認識されないのはなぜですか?
-
[解決済み】Rails。Ruby on Railsの移行でデータベースカラムの名前を変更するにはどうすればよいですか?
-
[解決済み】bcrypt LoadError: Cannot load such file
-
[解決済み】PG::ConnectionBad: fe_sendauth: パスワードが供給されない
-
[解決済み] gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み] Ruby on Railsでsimple_formを使うさまざまな方法|何が違うの?
-
[解決済み] Railsコントローラからホスト名を取得する
-
[解決済み] Rails / Haml: 投稿フォームを作成するには?
-
[解決済み] railsで':remote => true'はどのように動作するのでしょうか?
-
[解決済み] Heroku Error R14 (Memory quota exceeded): How do I solve this?