【问题标题】:Beginner Rails Migration & Column Options in ActiveRecordActiveRecord 中的初学者 Rails 迁移和列选项
【发布时间】:2015-10-02 23:44:34
【问题描述】:

关于 ActiveRecord 表创建中:null 选项的快速问题。

假设我要创建一个包含description 列的新表。

def change
    create_table :products do |t|
        t.string :name
        t.text :description, null: false
    end
end

如果我的模型中没有关于description 列的任何:presence 验证,那么“无”是否应该能够传递到描述列中?我不确定null: false 可以做些什么来阻止我什么都不传递,因为我没有任何验证。

【问题讨论】:

  • 如果您不需要对描述进行任何存在验证,请从迁移中删除 null: false。 null false 将强制要求必须有一些东西来进行描述
  • :null => false 告诉您的数据库不要接受 NULL 值。继续尝试创建一个描述为空的产品并告诉我它是否保存到数据库中

标签: sql ruby-on-rails migration database-migration


【解决方案1】:

Rails 迁移或架构选项(如 null: false)在数据库级别(存储)上运行。如果您尝试使用空描述字段保存记录,您将收到包含在 ActiveRecord::StatementInvalid: 中的数据库错误(例如由 PostgreSQL 生成)。在调用 object.valid? 时,从应用程序的角度(Rails)来看,该对象将是有效的。

Rails 验证(如 :presence)在应用程序级别运行。在这种情况下,传递一个空值将创建一个对象,该对象将在 valid? 上返回 false,并且您可以通过调用 object.errors. 轻松访问来自该对象的错误消息。如果不绕过验证,Rails 将不允许您将此类记录保存到数据库。

【讨论】:

  • 谢谢,有没有比验证更有利的情况?因为看起来验证是一个更好的解决方案。
  • 嗯,其中一种情况可能是您想要强制执行一些验证(这样您就不会弄乱数据库),因为正如我之前提到的,您实际上可以跳过验证保存前在 Rails 中记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2013-11-18
  • 1970-01-01
相关资源
最近更新 更多