2013-04-15 76 views
0

使用Rails 3,我现在用的是以下类型的代码来查询MySQL数据库:进一步为什么这个ActiveRecord Query不明确?

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 

正因为如此,没有理由让一个子查询中的JOIN声明:

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

最后,你应该已经有belongs_to关联设置为selleruser。这将意味着,你可以这样做:

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毫不含糊。