我怎样才能保持 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关系。您可以使用我在上次编辑中发布的那个。
你所要做的就是确保你有一个用户、一个聊天和一条链接他们的消息(这是我错过的)
我正在使用 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关系。您可以使用我在上次编辑中发布的那个。
你所要做的就是确保你有一个用户、一个聊天和一条链接他们的消息(这是我错过的)