find_by_sql не работает на рельсах 3.1.3 - PullRequest
1 голос
/ 04 декабря 2011

Я пишу довольно сложный запрос в 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 ]

1 голос
/ 04 декабря 2011

попробовать:

Employee.find_by_sql("SELECT * FROM `employees`")
1 голос
/ 04 декабря 2011

Если вы выбираете из таблицы employees, вам нужно использовать модель Employee.

Попробуйте вместо этого

Employee.find_by_sql("SELECT id, name, age FROM `employees`")
1 голос
/ 04 декабря 2011

Консоль использует симпатичную печать для вывода данных из любых экземпляров, возвращаемых запросом. Симпатичная печать реализуется автоматически в классе ActiveRecord в соответствии со столбцами, связанными с этой конкретной моделью, и поэтому не будет отображать атрибуты, которые не принадлежат этой конкретной модели.

Это не означает, однако, что атрибуты не были загружены в экземпляры. Симпатичная печать просто не показывает их, но они все еще там.

Итак, если вы просто сделаете:

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

Вы должны по-прежнему получать 56 в соответствии с вашим примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...