我使用以下Ruby代码:
sql = "SELECT * FROM
conversations
INNER JOIN member_users ON member_users.conversation_id = conversations.id
WHERE conversations.id = #{conversation.id}
AND member_users.user_id = #{user.id}"
cs = Conversation.find_by_sql(sql)
查询返回一行。但是,find_by_sql返回带有member_user的ID的Conversation,而不是Conversation的ID。这是因为有两个" id"结果中的列和find_by_sql似乎使用了错误的列。
有没有办法在不使用SELECT对话的情况下阻止这种情况。*而不是SELECT *?
为什么会发生这种情况 - 为什么Rails没有使用它遇到的第一个ID列?是因为行以哈希值返回吗?
更一般地说,在SQL中,有没有办法区分具有相同名称的不同列?或者这些是否相同?我经常在做连接时感到困惑,导致几个" id" COLS。
谢谢, 路易丝
答案 0 :(得分:2)
如果您在find_by_sql
查询中进行联接,ActiveRecord有时会混合表中具有相同名称的列。您可以通过将SELECT
子句更改为仅包含您感兴趣的表列来提示ActiveRecord正确映射。
因此,要解决您的问题,请将查询更改为
"SELECT conversations.* FROM conversations ..."
答案 1 :(得分:0)
我会发现它是这样的
class MemberUser < ActiveRecord::Base
belongs_to :conversation_user
scope :users, ->(*u) {
where(user_id: u.flatten.compact.uniq)
}
scope :conversations, -> (*c) {
where(conversation_id: c.flatten.compact.uniq)
}
end
Conversation.joins(:member_users).merge(MemberUser.users(user))
至于你的直接问题,你为什么要在已经拥有它时找到对话?