2012-04-19 77 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

前兩個將返回一個數組(具有該名稱的所有員工)。 Employee.find_by_first_name將只返回第一個結果 - Employee.find_all_by_first_name應返回一個數組,如前兩個查詢。

看看這樣做你所期望的:

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

(出於完整性,什麼Employee.where實際上返回的是一個可鏈接的範圍對象,行爲像數組)

+1

謝謝!很好的答案! – yiinewbie 2012-04-19 16:36:41

+0

另外,如何打印作爲前兩個語句結果的數組(可鏈式範圍對象),以便至少檢查內容? – yiinewbie 2012-04-19 16:38:01

+0

您可以在對象上調用.inspect()或使用速記並替換'p'的'puts'方法,該方法將自動調用正在打印的對象的檢查以進行屏幕檢查。 – salernost 2012-04-19 16:42:09

1

前兩個會發生什麼當你運行employee.first_name?它看起來像你應該得到一個無方法的例外,因爲Array沒有方法first_name

使用where子句不會自動返回找到的第一個員工模型對象,它會返回一個ActiveRecord :: Relation,然後當您嘗試訪問它時,它將被rails自動評估爲一個數組。 where條款將給您帶有first_name的所有員工==「賬單」

find_by_first_name將僅返回Employee類的單個實例,即使有多個僱員名爲「bill」。

如果您在運行前兩項之後嘗試employee.first.fist_name,我相信如果數據庫中的所有內容都正確並且有名字爲「bill」的僱員,您會發現「賬單」。