首页 > 解决方案 > :through 关联是在 Ruby on Rails 中链接联合表的正确方法吗

问题描述

我有 3 个表名为

用户表,

消息表和

Message_users 表

Users 表将用于存储用户信息,Messages 表将用于存储用户发送的消息,Message_users 表将存储 message_id 和 sender_id(发送消息的用户)和receiver_id(接收消息的用户)

在 Message 的模型类中,我有这个

class Message < ApplicationRecord has_many :user, :through :message_user dependent: :destroy end

在用户模型中,我有这个

class User < ApplicationRecord has_many :messages, :through :message_user, dependent: :destroy end

我不知道这是否是在 Message 模型和 User 模型之间创建链接的正确方法

标签: ruby-on-railsrubyruby-on-rails-5

解决方案


我不确定我是否理解您的模型,它看起来像是两个用户之间的对话,并且它有很多消息,但是您的“消息”模型有很多“message_users”或类似的东西。我认为命名是混乱的。

就个人而言,我会有这个模型:

Conversation
  has_many :messages
  has_and_belongs_to_many :users

Message
  belongs_to :conversation
  belongs_to :sender, class_name: 'User'

User
  has_and_belongs_to_many :conversations
  has_many :messages, as: :sender

您真的不需要保存receiver_id(对话中的任何用户都不是消息的发送者)。此外,您可以使用相同的配置在同一对话中拥有两个以上的用户。

阅读有关 HasAndBelongsToMany 的信息(它需要您创建一个连接表“conversations_users”,但您不需要模型)https://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-多关联

我知道它不尊重您的原始表格,但至少对我来说它们看起来令人困惑。


推荐阅读