sql - 似乎无法将对象保存到数据库中
问题描述
这是我的活动记录:
class CreateTasks < ActiveRecord::Migration[6.1]
def change
create_table :tasks do |t|
t.string :title
t.text :body
t.datetime :due
t.integer :priority
t.text :tag
t.timestamps
end
end
end
我试图在里面创建一个对象rails console
并保存它,但它一直返回 false
irb(main):008:0> t =Task.new(title:"First task", body:"body of first task", due:"2020-12-29", priority:2, tag:"tag of first task")
=> #<Task id: nil, title: "First task", body: "body of first task", tag: "tag of first task", due: nil, priority: 2, created_at: nil, updated_at: nil>
irb(main):018:0> t.save
=> false
我检查了多个站点以确保我的语法正确,但我仍然无法保存此对象
我的任务模型
class Task < ApplicationRecord
belongs_to :container
validates :title, presence: true
validates :body, presence: true, length: { minimum: 10 }
validates :priority, presence: true
validates :due, presence: true
validates :tag, presence: true
end
解决方案
当您遇到此类问题时,通过在该实例上输出错误很容易进行调试。因此,当您在调用then或调用then时返回false
时。save
t.errors.full_messages
f.valid?
t.errors.full_messages
在您的new
参数列表中,您缺少一个container_id
. 从文档中看并不明显,但在belongs_to :container
内部添加会添加对该关联存在的验证(除非您通过选项:)optional: true
。
此外 - 正如其他人已经指出的那样 - 您的数据库缺少一列来存储container_id
用于存储由belongs_to :container
.
因此,要解决您的问题,您必须做两件事:
- 定义
Container
模型及其数据库表,并belongs_to
正确设置关联。 - 将现有的传递
container_id
给Task.new
.