1

我正在 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。

它是一个错误吗?谁能帮帮我吗?

4

3 回答 3

1

如果您从employees表中进行选择,您将需要使用 Employee 模型。

试试这个

Employee.find_by_sql("SELECT id, name, age FROM `employees`")
于 2011-12-04T02:07:55.877 回答
1

尝试:

Employee.find_by_sql("SELECT * FROM `employees`")
于 2011-12-04T00:20:01.867 回答
1

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

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

所以,如果你这样做:

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

您仍然应该56按照您的示例进行操作。

于 2011-12-03T21:40:02.257 回答