我怎样才能保持 HABTM 关系?

How can I persist HABTM relationship?

我正在使用 HABTM 关系进行聊天。 基本上,用户有很多聊天,聊天有很多用户。这是聊天:

class Chat < ActiveRecord::Base

  has_and_belongs_to_many :users
  has_many :messages, dependent: :destroy

end

这是用户

class User < ActiveRecord::Base

  has_and_belongs_to_many :chats
  ...

我得到了我的表格、几个用户和几个聊天

在 Rails 控制台中,我尝试了

User.find(1).chats << Chat.find(1)

但是当我输入 User.find(1).chats 时,我得到一个 [] 我也试过

user = User.find(1)

user.chats << Chat.find(1)

user.save

也没用。我错过了什么?

这是 HABTM 的迁移

class CreateChatsUsers < ActiveRecord::Migration
  def change
    create_table :chats_users do |t|
      t.belongs_to :chat, index: true
      t.belongs_to :user, index: true
    end
  end
end

编辑 - 使用 has_many, through: 关系

聊天:

class Chat < ActiveRecord::Base

 has_many :messages, dependent: :destroy
 has_many :users, through: :messages

end

用户:

class User < ActiveRecord::Base

  has_many :messages, dependent: :destroy

  has_many :chats, through: :messages
....

消息:

class Message < ActiveRecord::Base
  belongs_to :chat
  belongs_to :user
end

最后,迁移:

class CreateMessages < ActiveRecord::Migration
  def change
    create_table :messages do |t|
      t.belongs_to :chat, index: true
      t.belongs_to :user, index: true
      t.datetime :message_date
      t.timestamps null: false
    end
  end
end

我错过了什么吗?

我相信如果您的迁移中没有 id: false,RoR 将不允许 HABTM 工作。见下文:

class CreateChatsUsers < ActiveRecord::Migration
  def change
    create_table :chats_users, id: false do |t|
      t.belongs_to :chat, index: true
      t.belongs_to :user, index: true
    end
  end
end

如果您只是在本地开发环境中进行试验,您可以只更改迁移,然后 rake db:drop db:create db:migrate。这将删除数据库,并 运行 所有迁移。永远不要在生产中完成!

如果没有,你可以生成一个新的迁移rails g migration remove_id_from_chats_users id:primary_key来移除id列,并且运行rake db:migrate.

好的,所以我终于找到了我的错误。

首先,是的,最好使用HMT关系。您可以使用我在上次编辑中发布的那个。

你所要做的就是确保你有一个用户、一个聊天和一条链接他们的消息(这是我错过的)