Присоединяйтесь и выберите несколько столбцов - PullRequest
1 голос
/ 16 января 2012

Я пытаюсь выбрать несколько столбцов после объединения. Я не мог найти способ сделать это, используя ActiveRecord без записи SQL между кавычками в запросе (Чего я хотел бы избежать)

Изучая Арель, я обнаружил, что могу выбрать несколько столбцов, используя «проект», однако я не совсем уверен, должен ли я использовать Арель напрямую или был ли способ добиться того же с AR.

Это код в Ареле:

l = Location.arel_table
r = Region.arel_table

postcode_name_with_region_code = l.where(l[:id].eq(location_id)).join(r).on(l[:region_id].eq(r[:id])).project(l[:postcode_name], r[:code])

После выполнения этого запроса я хотел бы вернуть что-то вроде: ( Псевдо-код )

"#{:postcode_name}, #{:code}"
  1. Есть ли способ выполнить тот же запрос, используя AR?
  2. Если я придерживаюсь Ареля, как я могу получить значения из класса SelectManager, который возвращает вышеуказанный запрос.

Заранее спасибо,

Ответы [ 2 ]

0 голосов
/ 14 июля 2012
predicate = Location.where(:id=>location_id).includes(:region)
predicate.ast.cores.first.projections.clear
predicate.project(Location.arel_table[:postcode_name], Region.arel_table[:code])
0 голосов
/ 16 января 2012

Используя AR, без написания SQL и предполагая, что ваши модели и ассоциации:

models / region.rb

class Region < ActiveRecord::Base
  has_many :locations
end

model / location.rb

class Location < ActiveRecord::Base
  belongs_to :region
end

Вы, безусловно, можете сделать:

postcode_name_with_region_code = Location.where(:id=>location_id).includes(:region).collect{|l| "#{l.postcode_name}, #{l.region.code}"}

Это сделает запрос, а затем использует Ruby для форматирования вашего результата (обратите внимание, что он вернет массив, так как я предполагаю, что может быть возвращено несколько записей).Если вам нужен только один элемент массива, вы можете использовать метод array.first для ссылки на него.

Вы также можете загрузить ассоциацию и построить строку из результата:

 my_loc = Location.find(location_id, :include=>:region)

 postcode_name_with_region_code = "#{my_loc.postcode_name}, #{my_loc.region.code}"
...