使用 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 将不会从数据库中取回它。
我的迁移看起来像这样
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 将不会从数据库中取回它。