В Ruby on Rails, как получить объединенный результат с помощью SQL? - PullRequest
0 голосов
/ 13 января 2011

Похоже, что если запрос

Product.find_by_sql("select * from products INNER JOIN order_entries ... ")

, тогда возвращаемые объекты будут объектами Product, а

OrderEntry.find_by_sql("select * from products INNER JOIN order_entries ... ")

вернет объекты OrderEntry.Есть ли способ вернуть объединенный результат?Причина в том, что из конечных объединенных результатов необходимо одно поле в Product, а также одно поле в OrderEntry.Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Я точно не знаю, о каком уровне детализации вы говорите, но обычно, когда мне приходилось выполнять соединение таким образом, я могу ссылаться на объединенные поля непосредственно из полученных объектов. Например, в проекте, где Заказчик может сделать несколько бронирований:

customer = Customer.first
=> #<Customer id:1 ...>
customer.date
=> NoMethod Error (this is a Reservation method)

но ...

customer = Customer.find_by_sql("select * FROM customers INNER JOIN reservations ON customers.id = reservations.customer_id").first
=> #<Customer id:1 ...>  #looks the same, but isn't 
customer.date
=> "2010-12-24"

Да, я понятия не имею, но объект реагирует на объединенные поля. Я искал минуту, чтобы понять, как отличить обычный объект от объекта с присоединенными полями, но не смог понять. Извините за краткость в мыслях и ответах, но опаздываю ...

1 голос
/ 13 января 2011

Если вы укажете имена столбцов (и они не являются неоднозначными), вы можете получить атрибут напрямую:

sql = "select products.name, order_entries.description \
  FROM products INNER JOIN order_entries ON products.id=order_entries.product_id"
result_set = Product.find_by_sql(sql)

Возвращает массив объектов только с выбранными столбцами.Теперь вы можете использовать имена столбцов без необходимости проходить через связь:

result = result_set.first
result.name # "Widget"
result.description # "Best seller!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...