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
我在做一个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