2011-03-07 6 views
1

조인 쿼리를 사용하여 쿼리와 함께 다른 테이블의 특성을 가져옵니다. 여기조인되지 않은 조인 된 테이블의 데이터

city = City.first(:select => "cities.*, states.name as state_name, states.time as state_time" 
        :joins => "LEFT JOIN states on cities.state_id = states.id", 
        :conditions => ["states.name = ?", params[:state]]) 

는 문제는 내가 city.state_time 같은 조인 된 테이블에서 값을 얻을 때, 나는 (어떤 타입 캐스팅이이 필드 레일에 의해 수행되지 않습니다) 대신에 시간 객체의 2010-11-12 05:00:00 같은 문자열을 얻을 것입니다. City 모델을 호출 할 때부터 의미가 있으며 typecasting 시간 열에 사용되는 메서드는 State 모델에 포함됩니다. 내가 명시 적으로 이렇게 시간을 구문 분석해야하며 시간대 문제와도 싸워야 할 것입니다. (레일즈가 Time 객체를 제공하는 동안 몇 가지 커스터마이징을하기 때문에 나는이 칼럼들을 위해 이것을해야 할 것이다). 조인을 수행하는 동안 열을 State에 연결하는 방법이 있습니까? 내가 생각한 한 가지 방법은 이것과 같습니다.

state = State.new(:name => city.state_name, :time => city.state_time) 

state.namestate.time를 사용합니다. 더 좋은 방법이 있습니까?

답변

1

여기 당신이 원하는 아마 :

class City < ActiveRecord::Base 
    belongs_to :state 
end 

class State < ActiveRecord::Base 
    has_many :cities 
end 

a = City.joins(:state).includes(:state).where(['states.name = ?', params[:state]]).first 
a.state.time 

이 내부 조인 사용하여 작동하고 몇 가지 조건이 있습니다

  • 도시는 하나 개의 상태에 속해야합니다. 도시가 어떤 상태에 속하지 않는 경우 내부는

레일이 구문

a = City.find(:all, :conditions => ['states.name = ?', params[:state]], :joins => :state, :include => :state) 
+0

원래 문제에 가입, 나는 직면하고 레일이 할 것입니다 때문에 쿼리를 반환하지 않습니다 문자열을 객체에 타이 캐스팅 (typecasting)하여 많은 것을 저장하고 조인 된 테이블의 경우이 모든 것을 기억하고 내 모델에서 수행해야합니다. 그래서'State' 모델 객체를 초기화하는 것입니다.하지만'State.new'가 설정 파일에 정의 된 시간대에서 Time을 취하고 있기 때문에 작동하지 않습니다. – rubyprince

+0

헤이, 나는 나의 대답을 완전히 편집했다. 왜 LEFT JOIN을 사용하셨습니까? – sled

+0

ok..thanks..got it .. 나는 기존의 코드에서 작업하고 있었고 왜 왼쪽 join이 사용되었는지 확신 할 수는 없지만 inner join으로 충분할 것이라고 생각합니다 .BTW Rails 2에서 동등한 것을 찾으려고합니다. 이 작동합니다. 나는 질문을 가지고있다 .'include'는'a.state'를 호출하는 동안 또 다른 sql 쿼리를 실행하지 못하게 할 것입니다. 나는 정상적인 경우 질의'SELECT *를 상태 id = # {a.state_id}'에서 발동 할 것인가? – rubyprince

관련 문제