2011-12-03 17 views
1

Ruby on Rails 3.1.3で非常に複雑なクエリを作成していますが、find_by_sqlを使用しています。find_by_sqlがレールで動作していません3.1.3

しかし、非常に単純なクエリで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はまったくありません。

バグですか?誰でも助けてくれますか?

答えて

1

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

ただし、属性がインスタンスにロードされたわけではありません。かなりの印刷物はそれらを見せないだけですが、まだそこにあります。

だから、あなただけ行う場合:

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

あなたまだあなたの例に係る56を取得する必要があります。

1

試してください:あなたはemployeesテーブルから選択している場合

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

あなたは従業員のモデルを使用したいと思うでしょう。

Employee.find_by_sql("SELECT id, name, age FROM `employees`") 
代わりにこれを試してみてください
関連する問題