Ruby on rails Rails与同一个类和联接表有许多不同的关系

Ruby on rails Rails与同一个类和联接表有许多不同的关系,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我想通过聊天在两个用户之间建立关系。聊天室有一个被邀请者和一个参与者,两者都是用户类型 假设我的示例中的模式和聊天模型是正确的,那么我缺少用户模型中的关系。在这里,我尝试了很多东西,但最终总是出错。基本上,我想从用户的角度实现以下目标: User.first.chats=>返回以被邀请者或参与者身份引用用户的所有聊天记录。 基本上,这应该返回与用户模型中的chats方法相同的结果 我想在用户模型中应该有两种关系: 但是,这些不起作用。我想问题是我使用了两次用户模型。另外两种解决方案可能在多个方面

我想通过聊天在两个用户之间建立关系。聊天室有一个被邀请者和一个参与者,两者都是用户类型

假设我的示例中的模式和聊天模型是正确的,那么我缺少用户模型中的关系。在这里,我尝试了很多东西,但最终总是出错。基本上,我想从用户的角度实现以下目标:

User.first.chats=>返回以被邀请者或参与者身份引用用户的所有聊天记录。 基本上,这应该返回与用户模型中的chats方法相同的结果

我想在用户模型中应该有两种关系:

但是,这些不起作用。我想问题是我使用了两次用户模型。另外两种解决方案可能在多个方面出错,但效果并不理想:

class User
  has_many :chats, ->(id) { where("invitee_id = ? OR participant_id = ?", id, id) }

  has_and_belongs_to_many :chatpartners,
                      class_name: "User",
                      join_table: "chats",
                      foreign_key: :invitee_id,
                      association_foreign_key: :participant_id
end
我想如果我正确处理了这些关系,这些事情就会自动发生:

Chat.first.invitee=>返回被invitee\u id引用的用户

Chat.first.participant=>返回参与者id引用的用户

User.first.chats.users=>返回聊天室引用的用户

这就是我到目前为止所做的:

用户模型

如果我忘了提及任何事情或是一些没有意义的事情,请告诉我。谢谢您的帮助。

一种方法是如下设置用户:

class User < ApplicationRecord
  # same as the method you have now
  def chats
    Chat.where("invitee_id = ? OR participant_id = ?", id, id)
  end

  def chat_partners
    User.where(id: chats.pluck(:invitee_id, :participant_id).flatten.uniq.reject { |i| i == self.id })
  end
end

谢谢你的回答,但我得到了这个错误:在用户上找不到名为“chats”的关联;也许你拼错了?@Linus:我使用的是你在问题中已经定义的聊天方法!:-为了进一步澄清——这是我目前拥有的:标题,而不是你提到的很多:聊天,当然,对不起,如果我有点不清楚的话:我的意思是,我认为我至少需要在这个模型中建立一种关系。不过还是要谢谢。为了清晰起见,我已经更新了代码示例。这里的棘手之处在于,它不仅涉及关联,还涉及您需要的特定逻辑,即您希望所有用户都不是当前用户,但可以是被邀请者或参与者。这段代码至少应该允许您提取这些用户,并返回可以支持进一步链接的ActiveRecord::Relation
class User < ApplicationRecord
  def chats
    Chat.where("invitee_id = ? OR participant_id = ?", id, id)
  end
end
class Chat < ApplicationRecord
  belongs_to :invitee, foreign_key: :invitee_id, class_name: "User"
  belongs_to :participant, foreign_key: :participant_id, class_name: "User"
end
ActiveRecord::Schema.define(version: 20170311085652) do
  enable_extension "plpgsql"

  create_table "chats", force: :cascade do |t|
    t.integer  "invitee_id"
    t.integer  "participant_id"
    t.datetime "created_at",     null: false
    t.datetime "updated_at",     null: false
  end

  create_table "users", force: :cascade do |t|
    t.datetime "created_at",                null: false
    t.datetime "updated_at",                null: false
  end
end
class User < ApplicationRecord
  # same as the method you have now
  def chats
    Chat.where("invitee_id = ? OR participant_id = ?", id, id)
  end

  def chat_partners
    User.where(id: chats.pluck(:invitee_id, :participant_id).flatten.uniq.reject { |i| i == self.id })
  end
end