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