我在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。
这是一个错误吗?有人可以帮帮我吗?
答案 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`")