2013-04-15 2 views
0

, 나는 MySQL 데이터베이스 쿼리 코드의 다음과 같은 종류를 사용하고 있습니다 : 아래로 더, 그리고 조금이 ActiveRecord 쿼리가 모호하지 않은 이유는 무엇입니까? 레일 3

MyData.joins('JOIN (SELECT id, name FROM sellers) AS Q 
    ON seller_id = Q.id'). 
    select('*'). 
    joins('JOIN (SELECT id, name FROM users) AS T 
    ON user_id = T.id'). 
    select("*").each do |record| 
    #.......... 

을,이 코드는 "이름"에 접근을 시도 : (모두 있습니다 판매자 및 사용자의 이름란이 있음).

str = record.name 

이 줄은 "판매자 이름"대신 "사용자 이름"을 제공하지만 아무 것도주지 않아야합니까? 이름 열을 가진 여러 테이블을 조인 했으므로 "column 'name'이 모호합니다"라는 오류가 발생하지 않아야합니까? 왜 이런 일이 일어나지 않습니까?

그리고 그 코드는 첫 번째 "select ('*')"행을 포함하든 그렇지 않든 같은 방식으로 동작합니다.

감사합니다.

답변

2

첫째, select을 두 번 호출 할 이유가 없습니다. 마지막 호출 만 실제로 사용됩니다. 둘째, select("*")을 사용하지 않아야합니다. SQL 데이터베이스 (및 레일스)가 모호한 열의 이름을 바꾸지 않기 때문입니다. 대신, 당신이 필요로하는 여분의 열을 명시 적으로 이름을 사용 : 마지막으로

MyData.joins('JOIN sellers AS Q ON ...', 'JOIN users AS T ON ...'). 

그리고 당신이 이미 가지고 있어야 :이 때문에

MyData.joins('JOIN (SELECT..) AS Q ON ...', 'JOIN (SELECT...) AS T ON ...'). 
     select('my_datas.*, T.name as t_name, Q.name as q_name'). 
     each do |record| 
    # do something 
end 

, 당신의 가입 문에서 하위 쿼리를 만들 이유가 없다 및 user에 대해 belongs_to 연결을 설정하십시오. 즉, 그냥이 작업을 수행 할 수 있다는 것을 의미합니다 :

MyData.joins(:seller, :user). 
     select("my_datas.*, sellers.name as seller_name, users.name as user_name"). 
     each do |record| 
    # do something 
end 

지금 당신이 어떤 모호함없이 record.seller_namerecord.user_name를 호출 할 수 있습니다.

관련 문제