2012-01-15 8 views
1

조인을 한 후에 여러 열을 선택하려고합니다. 쿼리에서 따옴표 사이에 SQL을 쓰지 않고 ActiveRecord를 사용하는 방법을 찾지 못했습니다. (피하고 싶습니다.)여러 열을 결합하여 선택

"프로젝트"를 사용하여 여러 열을 선택할 수 있습니다. 그러나 내가 Arel을 직접 사용해야하는지 또는 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]) 

이 쿼리를 실행 한 후 나는의 라인을 따라 뭔가를 반환하고 싶습니다 :

은 Arel의 코드입니다 ( 의사 코드)

"#{:postcode_name}, #{:code}" 
  1. AR을 사용하여 동일한 쿼리를 수행하는 방법이 있습니까?
  2. Arel을 고수하면 SelectManager 클래스에서 값을 가져올 수 있습니다. 위의 쿼리가 반환됩니다. 어떤 SQL을 작성하고 모델과 연결을 가정하지 않고, AR을 사용하여 사전에

감사합니다,

답변

0

은 다음과 같습니다

모델/region.rb

class Region < ActiveRecord::Base 
    has_many :locations 
end 

모델/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}"} 

쿼리를 수행 한 후 (I 반환 여러 레코드가있을 수 있으리라 믿고있어 이후로는 배열을 반환 않습니다) 당신의 결과를 포맷 루비를 사용합니다. 배열의 항목 하나만 원한다면 array.first 메소드를 사용하여 참조 할 수 있습니다.

당신은 열망 부하에게 또한 연결을 할 수 있었던 결과에서 문자열을 구축 :

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

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

감사 마이크 당신이 대답을. 성능 측면에서 보면 포함하는 것보다 조인을하는 것이 더 효과적이지 않습니까? 이 쿼리에서는 성능에 큰 타격을주지 않을 수도 있지만 include를 사용할 때 DB를 두 번 쿼리합니다. – Digger

+0

조인은이 경우 실제로 아무것도 구입하지 않습니다. 시도하려는 경우 .includes (...)를 .joins ("JOIN locations.region_id ON regions.id")로 바꿉니다. 두 번째 쿼리는 지역 코드를 쿼리하는 collect 문의 결과입니다. 나는 당신이 그것을 시도하고 싶다면 협회의 열렬한로드를 활용하는 솔루션을 추가했다. – miked

+0

고마워, 나는 그것을 줄 것이다. AR을 사용하여 약간의 연주를 한 후에 내가 사용하기 시작한 쿼리였습니다 : 'Location.joins (: region) .where (: id => location_id) .select ('locations.postcode_name, regions.code') .map {| l | "# {l.postcode_name}, # {l.code}"}' – Digger

0
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]) 
관련 문제