ActiveRecord中有多个belongs_to

时间:2018-01-23 16:13:19

标签: ruby-on-rails activerecord

我希望为消息传递系统建模。

目前我有两个型号,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 (?, ?, ?)):

我在这里缺少什么?建立这种关系的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

这里有些不对劲。

根据docs,迁移中的belongs_toreferences的别名)会选择以下选项::type:index,{{ 1}},:foreign_key:polymorphic。没有:null:class_name应为:foreign_keytrue(默认为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哪个。