Ruby on rails 在Rails 3活动记录查询中使用WHERE子句

Ruby on rails 在Rails 3活动记录查询中使用WHERE子句,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我是rails新手,尝试使用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 我正在通过打印emp

我是rails新手,尝试使用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
来测试结果,就像我说的,前两个不返回任何东西,而第三个返回“bill”。这里发生了什么?

前两个将返回一个数组(所有具有该名称的员工)
Employee.find_by_first_name
将只返回第一个结果--
Employee.find_all_by_first_name
应返回与前两个查询类似的数组

看看这是否符合您的期望:

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

(为了完整起见,
Employee.where
实际返回的是一个像数组一样的可链接范围对象)

运行
Employee.first\u name
时,前两个会发生什么?在我看来,您应该得到一个无方法异常,因为数组没有方法名

使用where子句不会自动返回找到的第一个employee模型对象,它将返回一个ActiveRecord::Relation,当您尝试访问它时,rails将自动将该关系计算到一个数组中。where子句将返回名为“bill”的所有员工

find_by_first_name
将只返回Employee类的一个实例,即使有多个名为“bill”的员工


如果您在运行前两个之后尝试
employee.first.first\u name
,我相信您会发现,如果数据库中的所有内容都正确,并且有一个名为“bill”的员工,您会得到“bill”。

此外,我如何打印数组(可链接范围对象)这是前两条语句的结果,这样我至少可以检查内容?您可以对对象调用.inspect(),或者使用速记并替换“p”的“put”方法,该方法将自动对正在打印到屏幕上的对象调用inspect。此外,还可以调用
Employee.where(“first_name=?”,“bill”).to_a
将强制Rails将作用域转换为正常数组,该数组将在控制台中正常显示。