使用 PostgreSQL 适配器限制 ActiveRecord 迁移 5.0 中的文本列

Limit a text column in an ActiveRecord migration 5.0 using the PostgreSQL adapter

我的迁移看起来像这样

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 在 PostgreSQL 中生成一个 text 列和 text doesn't allow for size limits 因为 text 是:

variable unlimited length

由于数据库不支持任何限制,PostgreSQL 驱动程序不会寻找 :limit 选项;请记住,您说的是 t.text(column_name, options_hash),因此您可以将任何您想要的内容放入 options_hash 中,驱动程序将忽略它不是专门寻找的任何内容。

如果你想限制列的大小,那么你可以手动添加一个 CHECK 约束(ActiveRecord 无法理解,所以你必须从 schema.rb 切换到 structure.sql)或者使用 varchar 列(又称 t.string):

t.string :body, null: false, limit: 260

此外,您的 schema.rb 是根据数据库中的内容而不是迁移中的内容生成的。由于 text 不支持限制,数据库不会知道您的 limit: 260 选项;如果数据库不知道它,当 ActiveRecord 向数据库询问模式信息时,ActiveRecord 将不会从数据库中取回它。