微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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将不会从数据库获取它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐