我有一个看起来像这样的迁移
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
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将不会从数据库中获取它.