2011-11-08 10 views
0

これら2つの方法で作成されたオブジェクトの違いは何ですか:レール.findから作成されたオブジェクトの差(:ID)と.where()メソッド

tec = Technique.find(6) 
tec2 = Technique.where(:korean => 'Jok Sul') 

データごとに返されることは正確です同じですが、最初のオブジェクトはupdate_attributesのような継承されたメソッドに完全に応答し、2番目のオブジェクトはメソッドが見つからないというエラーを返します。

私がtec.classとtec2.classを実行すると、ActiveRecord :: Relationであり、もう1つはクラスをまったく与えないので、オブジェクトの内容を出力します。あなたは.where方法あなたが唯一の一致がある場合でも、配列を取得を使用しているため、いつでも持っているとき

たぶん内容を取得するための.eachメソッドを発行するには?しかし、それは、誰かが私のためにこれを明確にすることができ

など、それは難しいあなたがレコードを更新したいときに対処するのですか?具体的には、.whereメソッドで見つかったマッチを処理する方法。

ありがとうございました。

答えて

2

試してください:あなたが慣例で一意であることが保証されているデータベース、オブジェクトIDを指定しているので

tec2 = Technique.where(:korean => 'Jok Sul').first 
+0

偉大な、私はそれを考えたことはありません。これは実際には1つのアイテムのみを返し、.findと同じメソッドに応答します。ありがとう。 – kakubei

1

find(6)は、単一のオブジェクトを返します。

where呼び出しが長いだけで1項目でもコレクションを返しますが、それはまだ、コレクションではなく、単一のオブジェクトを返します。

この違いを明らかにすることができます。あなたのサンプルコードを使用して、tec.classtec2.classを呼び出すと、期待どおり、それらが同じクラスのオブジェクトではないことがわかります。 、オブジェクトのコレクションに利用可能な方法である

は、そのオブジェクトのインスタンスに利用可能な方法とは異なります。

+3

実際にはwhereメソッドはコレクションではなくActiveRelationを返します – matteo

+0

説明のおかげで、私は答えとして以下のマークをつけています。実際にそれを処理する方法を示しているので、.find ) – kakubei

+1

私はこれがRails3の場合に過ぎないと思います、それは正しいのですか? – jefflunt

2

良い質問です。

tec_scope = Technique.where(:korean => 'Jok Sul') # create an internal query 

ここではクエリのみが作成され、実行されません。あなたが望むなら、このクエリの上にプログラムで構築することができます。スコープ(または望むならば、クエリ)は2つの方法で実行されます。 "暗黙的"または "明示的"。暗黙的にクエリを実行する方法は、たとえば、コンソールで自動的にクエリを実行するスコープ上のメソッドを呼び出すなどです。あなたがあなたのクエリに

tec_scope.all # returns array 
tec_scope.first # retuns one element 

スコープがちょうど追加されている節/述語を.e.gに対して明示的にそれを実行しない限り、これは文句を言わないあなたのコントローラ内で起こります。クエリーを構築し、実行が必要になるまで延期します。

しかし、

tec_objects = Technique.find(6) # explicitly runs a query and returns one object (in this case) 

これは、明示的に存在し、その後、クエリを実行します。これは、クエリの実行のタイミングの問題です。

違いは微妙ですが、非常に重要です。

このhasntは、1つの結果または配列を取得するかどうかとは何を得ました。

Technique.find([4,5]) # will return an array 
Technique.find(4) # will return one object 
Technique.where(:some_key => "some value").all # will return an array 
Technique.where(:id => 5).first # will return one object 

違いは、クエリの実行のタイミングです。違いがないとコンソールにあなたをばかにさせてはいけません。コンソールは暗黙的にあなたのために質問を発しています:)

+0

これは非常に役に立ちます。ありがとうございます。 – kakubei

+1

@kakubeiどこかの違いを知りたかったと思った。あなたはちょうど(条件)について知りたいと分かっていませんでした。最初の: –

+0

@Aditya、良い点と良い答え... +1。 – Ernest

関連する問題