find_by_sql无法在rails 3.1.3上运行

时间:2011-12-03 21:23:52

标签: ruby-on-rails ruby find-by-sql

我在Ruby on Rails 3.1.3中编写了一个非常复杂的查询,我正在使用find_by_sql。

但是我注意到一个非常奇怪的行为,即使我使用find_by_sql进行非常简单的查询。

这是一个简单的例子:

让我们说我有两个模型和相关表格:

Model 1: Company
Table 1: companies
         fields: id, name, address

         | id | name |    address      |
         +----+------+-----------------+
         |  1 | ACME | Bond street, 56 |

Model 2: Employee
Table 2: employees
         fields:  id, name, age

         | id | name | age |
         +----+------+-----+
         |  1 | Fred |  56 |
         |  2 | Adam |  27 |

以下是发生的事情;如果我写:

Company.find_by_sql("SELECT * FROM `employees`")

我明白了:

Company Load (0.3ms)  SELECT * from `employees`
=> [#<Company id: 1, name: "Fred">, #<Company id: 2, name: "Adam">]

我只获得员工的名字与公司名称相匹配的领域(即田间年龄缺失)! 根本没有@attributes。

这是一个错误吗?有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:1)

控制台使用漂亮的打印输出查询返回的任何实例的数据。漂亮打印由ActiveRecord根据与特定模型关联的列自动在类中实现,因此不会显示不属于该特定模型的属性。

但这并不意味着属性未加载到实例中。漂亮的印刷只是没有展示它们,但它们仍然存在。

所以如果你这样做:

Company.find_by_sql("SELECT * from employees").first.age

根据您的示例,您应该仍然获得56

答案 1 :(得分:1)

尝试:

Employee.find_by_sql("SELECT * FROM `employees`")

答案 2 :(得分:1)

如果您从employees表中进行选择,则需要使用员工模型。

试试这个

Employee.find_by_sql("SELECT id, name, age FROM `employees`")