2013-04-15 4 views
0

С Rails 3, я использую следующий вид кода для запроса базы данных MySQL:Почему этот запрос ActiveRecord NOT неоднозначен?

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 

Эта строка дает мне «имя пользователя» вместо «имени продавца», но разве это ничего не даст? Поскольку я присоединился к нескольким таблицам с столбцом имен, не должен ли я получить ошибку, например, имя столбца «неоднозначно»? Почему это не происходит?

И, кстати, код ведет себя одинаково, независимо от того, включаю ли я первую строку «select ('*')» или нет.

спасибо.

ответ

2

Во-первых, нет причин для вызова select дважды - используется только последний вызов. Во-вторых, вы не должны использовать select("*"), потому что база данных SQL (и Rails) не будет переименовывать неоднозначные столбцы для вас. Вместо этого следует использовать явное присвоение имен для дополнительных столбцов, которые вам нужны:

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 

Из-за этого, нет никаких причин, чтобы сделать подзапрос в вашем РЕГИСТРИРУЙТЕСЬ заявление:

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

И, наконец, вы должны уже иметь belongs_to ассоциации, созданные для seller и user. Это означало бы, что вы можете просто сделать это:

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_name и record.user_name без какой-либо двусмысленности.

Смежные вопросы