подключение.select_all против select с объединениями в rails 3

#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)