首页 > 解决方案 > Chat belongs_to 两个 User 实例和 User has_many :chats (ruby on rails )

问题描述

我正在构建一种“非即时消息系统”。我的系统由许多用户、聊天和消息组成。

我设计它的方式是:

rails g model Chat user1:references user2:references
rails g model Message user:references chat:references

然后在我的模型/chat.rb 我做:

# models/chat.rb
class Chat < ApplicationRecord
  belongs_to :user1, :class_name => 'User'
  belongs_to :user2, :class_name => 'User'
end

我的模型/message.rb 模型

# models/message.rb
belongs_to :user
belongs_to :chat

还有我的 models/user.rb 模型

# models/user.rb
has_many :chats
has_many :messages, through: :chats

所有这些建模对我来说都很有意义,但我就是无法让它发挥作用。我需要能够做类似的事情User.find(1).chats并让它返回所有用户的聊天记录。也会Chat.find(1).users很好。User.find(1).messages 并没有那么麻烦,因为它是非常标准的关系,但是其他的呢?我错过了什么?我已经通过论坛阅读了论坛,但我似乎无法找到任何解决方案来处理我的具体案例。

标签: ruby-on-railsrubychat

解决方案


我建议进行这些更改(在@TonyArra 的帮助下):

  • 聊天have_many消息
  • 留言belongs_to聊天
  • 聊天have_and_belongs_to_many(或belongs_to)用户
  • 用户have_and_belongs_to_many(或have_many)聊天

这将是建模的传统方法,我认为它会支持您的用例。

我在评论中提到了 YAGNI,因为 OP 提到只有两个用户的聊天。YAGNI(你不会需要它,所以现在不要构建它)是一个很好的原则。但是,许多聊天程序支持两个以上的用户,有时只支持一个用户。您可能会争辩说,考虑到这一点来构建数据模型是务实的。

关于该主题的精彩进一步阅读:抢先多元化(可能)不是邪恶的


推荐阅读