我希望为消息传递系统建模。
目前我有两个型号,User和Message。我希望消息与用户,发送者和接收者之间存在多种关联。
这是我的消息的活动记录迁移。
class CreateMessages < ActiveRecord::Migration[5.1]
def change
create_table :messages do |t|
t.string :body
t.belongs_to :sender, :class_name=>'User', :foreign_key=>'sent_from'
t.belongs_to :recipient, :class_name=>'User', :foreign_key=>'sent_to'
t.timestamps
end
end
end
但是当我尝试创建新消息时,我收到以下错误:
class DashboardController < ApplicationController
before_action :authenticate_user!
def index
Message.create(body: "Hello World", 1, 2)
end
end
但是我收到以下错误
ActiveRecord::StatementInvalid (SQLite3::SQLException: no such table: main.recipients: INSERT INTO "messages" ("body", "created_at", "updated_at") VALUES (?, ?, ?)):
我在这里缺少什么?建立这种关系的最佳方法是什么?
答案 0 :(得分:0)
这里有些不对劲。
根据docs,迁移中的belongs_to
(references
的别名)会选择以下选项::type
,:index
,{{ 1}},:foreign_key
和:polymorphic
。没有:null
,:class_name
应为:foreign_key
或true
(默认为false
)。
因此,您的迁移可能看起来更像:
false
class CreateMessages < ActiveRecord::Migration[5.1]
def change
create_table :messages do |t|
t.string :body
t.belongs_to :sender
t.belongs_to :recipient
t.timestamps
end
end
end
看起来像:
message.rb
我不知道你为什么在class Message < ActiveRecord::Base
belongs_to :sender, class_name: 'User'
belongs_to :recipient, class_name: 'User'
...
end
的{{1}}行动中创建了Message
。但是,嘿,不管你的船漂浮着什么。
但是,它应该看起来更像:
index
或者,它可能看起来像:
DashboardController
Rails非常聪明,但是当你这样做时:
class DashboardController < ApplicationController
before_action :authenticate_user!
def index
Message.create(body: "Hello World", sender_id: 1, recipient_id: 2)
end
end
知道1是发件人还是收件人并不是那么聪明。与2.相同你需要告诉rais哪个。