#ruby-on-rails-3 #select #join
#ruby-on-rails-3 #выберите #Присоединиться
Вопрос:
Здесь, ниже, lo принадлежит titres, titre имеет много lo.
Когда я использую:
LO.select(["los.id","date_ord","soc","pv"]).joins(:titre).
where(['year(date_ord) = ? and pv is not null',"#{date_ord}"]).
group("num_ordre").order("soc,date_ord")
он не извлекает поле soc из titre.
Тогда как, если я использую:
search_year = "year(date_ord) = '#{date_ord}'"
connection.select_all("select los.id, date_ord, soc, pv "
"from los inner join titres on los.titre_id=titres.id "
"where #{search_year} and pv is not null "
"group by num_ordre order by soc, date_ord;")
он извлекает его.
Есть ли что-то фундаментальное, чего мне здесь не хватает?
Или выбор ограничивает извлечение полей, кроме полей из таблицы базы данных «из», и ничего из таблицы соединений?
Есть ли более удобный способ выполнить этот запрос, чтобы он давал тот же результат, что и соединение.версия select_all?
Среда: rails 3.0.5 с jruby 1.6 (ruby 1.8.7).
Заранее спасибо за любые подсказки.
Ответ №1:
Активные методы поиска записей подключаются вместе с моделью, вызывающей их. Следовательно, они будут ожидать, что результат соответствует формату модели и создаст объект этой модели.
Тем временем, подключение.select_all не зависит ни от какой модели и просто возвращает массив хэшей.
Ответ №2:
Вы можете передать созданный вами запрос в ActiveRecord::Base.connection.select_all
, чтобы избежать создания модели и по-прежнему возвращать результаты, как если бы вы передали ему необработанную строку sql:
query = LO.select(["los.id","date_ord","soc","pv"]).joins(:titre).
where(['year(date_ord) = ? and pv is not null',"#{date_ord}"]).
group("num_ordre").order("soc,date_ord")
data = ActiveRecord::Base.connection.select_all(query)