首页 > 解决方案 > 似乎无法将对象保存到数据库中

问题描述

这是我的活动记录:

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

标签: sqlruby-on-railsdatabase

解决方案


当您遇到此类问题时,通过在该实例上输出错误很容易进行调试。因此,当您在调用then或调用then时返回false时。savet.errors.full_messagesf.valid?t.errors.full_messages

在您的new参数列表中,您缺少一个container_id. 从文档中看并不明显,但在belongs_to :container内部添加会添加对该关联存在的验证(除非您通过选项:)optional: true

此外 - 正如其他人已经指出的那样 - 您的数据库缺少一列来存储container_id用于存储由belongs_to :container.

因此,要解决您的问题,您必须做两件事:

  1. 定义Container模型及其数据库表,并belongs_to正确设置关联。
  2. 将现有的传递container_idTask.new.

推荐阅读