irb
を使用して物事を調査するというアーティファクトが表示されています。
あなたはこの言うとき:
> Product.first.title
#=> nil
をごmethod_missing
がレイジーロードtitle
メソッドに呼び出され、あなたがnil
を取得します。
あなたが言うときは、この:あなたはこれを効果的にやっている
> Product.first
:最初の製品のインスタンスがロードされ、その後、irb
それにinspect
を呼び出すとARが追加されます
> p = Product.first; puts p.inspect
途中のアクセサメソッド。その結果、Productにはtitle
メソッドが追加されます。したがって、これを行う:Product.first.title
を呼び出すための本当のtitle
方法があるだろうと
> Product.first
> Product.first.title
は、すべてあなたのmethod_missing
を呼び出すことはありません。
あなたはこのように再度お試し場合:
> Product.first; nil
> Product.first.title
次の2つのnil
秒が表示されます。
限りの連鎖が行くように、ActiveRecordのは本当に終わりを検出しない、それはいくつかの方法が自然に、データベースから実際のデータを必要とし、いくつかにはない呼び出すだけということです。
あなたがwhere
、order
、または他の照会メソッドを呼び出す場合は、バックActiveRecord::Relationインスタンスを取得し、あなたはその関係オブジェクトのチェーンよりクエリメソッドとスコープをすることができます。例えば、(ActiveRecordのは::関係はActiveRecord::QueryMethodsを含むことにより取得)、このようになりますwhere
:それはちょうど、現在のクエリのコピーを作成コピーにいくつかのことを追加し、あなたのコピーを与える
def where(opts, *rest)
return self if opts.blank?
relation = clone
relation.where_values += build_where(opts, rest)
relation
end
バック。
あなたがfirst
、last
、to_a
、all
、Enumerable方法(すなわち、あなたがeach
を呼び出す)のいずれかを呼び出す場合、...特定のインスタンスについて質問すると、問題のモデルインスタンスを実現するためにActiveRecordがクエリを実行する必要があります。例えば、ActiveRecord::Relation#to_a
は次のようになります。
def to_a
logging_query_plan do
exec_queries
end
end
とall
はto_a
のラッパーより少しです。
ActiveRecordは実際にはチェーンの終わりがわからないので、データベースから何もロードされないので、チェーンが終了する場所を教えてください。と言って。
私はチェーンの終わりを検出すると思います。ファインダのプロキシオブジェクトを返さない場所です! – phoet
これは質問に関するものではありません。なぜなら、 '' '' method_missing'''がモデルの中で使われるとき、 '' '' Product.first.title'''は '' '' Product.first'''が呼ばれるまで '' '' nil''を返すのです。 '' '' Product.first''を呼ぶと、titleは '' 'My sample blog''を返します。 – user544941
@ user544941:ああ、私は彼が何を求めているのかを見ています:何が彼の 'method_missing'を置き換えるかバイパスしています。 –