2012-04-19 20 views
4

私はrailsが新しく、whereメソッドを使用してデータテーブルからレコードを取得しようとしています。しかし、それを使用しても結果は返されないようです。Rails 3のアクティブレコードクエリでWHERE句を使用

employee = Employee.where("first_name = ?", "bill") #doesn't work 

employee = Employee.where(:first_name => "bill") #doesn't work 

employee = Employee.find_by_first_name("bill") #works 

私はemployee.first_nameを印刷して、結果をテストしてるなど、私は三番目は「法案」を返すのに対し、最初の二つは何も返さないと述べました。何が起きてる?

答えて

8

最初の2つは配列(その名前を持つすべての従業員)を返します。 Employee.find_by_first_nameは最初の結果のみを返します。Employee.find_all_by_first_nameは、最初の2つのクエリのように配列を返す必要があります。

これは何を期待している場合を参照してください:

Employee.where("first_name = ?", "bill").first 

(完全を期すために、どのようなEmployee.where実際に返すことは、アレイのような行為ことチェイン可能範囲の対象である)

+1

ありがとうございます!素晴らしい答え! – yiinewbie

+0

また、最初の2つのステートメントの結果である配列(連鎖可能なスコープオブジェクト)を印刷して、少なくとも内容を調べることはできますか? – yiinewbie

+0

オブジェクトの.inspect()を呼び出すか、省略名を使用して、 'p'の 'puts'メソッドを置き換えます。これは、画面に印刷するオブジェクトのinspectを自動的に呼び出します。 – salernost

1

最初の2のために何が起こるのかemployee.first_nameを実行すると、配列はメソッドfirst_nameを持たないので、メソッドの例外が発生しているはずです。

where句を使用すると、見つかった最初の従業員モデルオブジェクトが自動的に返されることはありません。アクセスしようとすると、自動的に配列で評価されるActiveRecord :: Relationが返されます。 where句は、first_name == "bill"を持つすべての従業員を戻します。

find_by_first_nameは、 "bill"という名前の従業員が複数いる場合でも、Employeeクラスの単一インスタンスのみを返します。

最初の2つを実行した後にemployee.first.fist_nameを試してみると、データベースのすべてが正しい場合、最初の名前が「請求書」の従業員がいる場合、「請求書」を受け取ると思います。

関連する問題