connection.select_all против выбора с объединениями в рельсах 3 - PullRequest
1 голос
/ 06 апреля 2011

Здесь ниже, lo принадлежит титрам, 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")

не извлекает поле соц из титра.

Принимая во внимание, что если я использую:

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 ограничивает извлечение полей из полей из таблицы базы данных и ничего из таблицы соединений?

Есть ли более удобный способ выполнить этот запрос, чтобы он давал тот же результат, что и версия connection.select_all?

Среда: рельсы 3.0.5 с jruby 1.6 (ruby 1.8.7).

Заранее спасибо за любые подсказки.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2015

Вы можете передать созданный запрос на 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)
0 голосов
/ 23 мая 2012

Методы поиска Active Record присоединяются к вызывающей их модели. Поэтому они ожидают, что результат будет следовать формату модели и создаст объект этой модели.

Между тем, connection.select_all не зависит от какой-либо модели и просто возвращает массив хэшей.

...