ruby-on-rails – 使用PostgreSQL适配器限制ActiveRecord迁移5.0中的文本列

我有一个看起来像这样的迁移

class CreateQuestionings < ActiveRecord::Migration[5.0]
  def change
    create_table :questionings do |t|
      t.text :body,null: false,limit: 260
    end
  end
end

现在当我运行$rake db:migrate:reset时,在我的db / schema.rb中无处可见:

create_table "questionings",force: :cascade do |t|
  t.text     "body",null: false
end

我做错了还是这个错误

顺便说一句,我使用rails 5.0.0.beta3和ruby 2.3.0p0.

解决方法

t.text在Postgresqltext doesn’t allow for size limits生成一个文本列,因为文本是:

variable unlimited length

由于数据库不支持限制,因此Postgresql驱动程序不会查找:limit选项;请记住,你正在说t.text(column_name,options_hash),所以你可以把任何你想要的东西扔进options_hash,驱动程序将忽略它没有特别寻找的任何东西.

如果要限制列大小,则可以手动添加CHECK约束(ActiveRecord将无法理解,因此您必须从schema.rb切换到structure.sql)或使用varchar列(AKA t.string) ):

t.string :body,limit: 260

此外,schema.rb是根据数据库中的内容生成的,而不是基于迁移中的内容生成的.由于文本不支持限制,因此数据库不会知道您的限制:260选项;如果数据库不知道它,当ActiveRecord向数据库询问架构信息时,ActiveRecord将不会从数据库获取它.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...