Rails:find_by_sql使用错误的ID

时间:2016-10-11 15:59:08

标签: sql ruby-on-rails

我使用以下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。

谢谢, 路易丝

2 个答案:

答案 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))

至于你的直接问题,你为什么要在已经拥有它时找到对话?