1

私はRubyonRails 3.1.3で非常に複雑なクエリを作成しており、find_by_sqlを使用しています。

しかし、非常に単純なクエリでfind_by_sqlを使用したとしても、非常に奇妙な動作に気づきました。

簡単な例を次に示します。

2つのモデルと関連するテーブルがあるとしましょう。

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

コンソールは、きれいな印刷を使用して、クエリによって返されたインスタンスからデータを出力します。きれいな印刷は、その特定のモデルに関連付けられた列に従ってクラスに自動的に実装されるActiveRecordため、その特定のモデルに属していない属性は表示されません。

ただし、属性がインスタンスにロードされなかったことを意味するわけではありません。きれいな印刷はそれらを表示していないだけですが、それらはまだそこにあります。

だからあなたがするだけなら:

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

あなたまだ56あなたの例に従って得るべきです。

于 2011-12-03T21:40:02.257 に答える
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 に答える