为什么这个ActiveRecord查询不明确?

时间:2013-04-15 18:36:23

标签: mysql ruby-on-rails activerecord

使用Rails 3,我使用以下类型的代码来查询MySQL数据库:

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('*')”行,代码的行为都是一样的。

谢谢。

1 个答案:

答案 0 :(得分: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_toseller设置了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_namerecord.user_name