Rails has_many 索引列不能为空

Rails has_many index column can't be null

我在做一个Message模型,关联是

User has_many messages
Message belongs_to user

消息有两种,一种是public,另一种是私信。这取决于它的 is_public 列。

这是我的消息架构

create_table "messages", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
  t.string   "title"
  t.text     "content",    limit: 65535
  t.boolean  "is_public"
  t.integer  "user_id"
  t.datetime "created_at",               null: false
  t.datetime "updated_at",               null: false
  t.index ["user_id"], name: "index_messages_on_user_id", using: :btree
end

我认为只有私信应该包含user_id

但是,我发现我不能直接创建message

例如

m = Message.create
=> #<Message:0x007fa6724e9d80 id: nil, title: nil, content: nil, is_public: nil, user_id: nil, created_at: nil, updated_at: nil>
Message.count 
=> 0
User.first.messages << m
Message.count
=> 1

有没有更好的方法可以保留 index 并创建 message 而无需关联?

我不确定您使用的 rails 是哪个版本

但是如果您使用的是 Rails 5,无论何时定义 belongs_to 关联,都需要默认存在关联记录

您可以将 "required" 设置为 false 以跳过

class  Message < ApplicationRecord
  belongs_to :user, required: false
end

Please read this for further details