gpt4 book ai didi

mysql - 为什么这个 ActiveRecord 查询没有歧义?

转载 作者:行者123 更新时间:2023-11-29 08:33:04 24 4
gpt4 key购买 nike

使用 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('*')”行,代码的行为方式都是相同的。

谢谢。

最佳答案

首先,没有理由调用 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 ...').

最后,您应该已经为 selleruser 设置了 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

关于mysql - 为什么这个 ActiveRecord 查询没有歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16022386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com