如何在迁移文件中添加验证(Rails 4)

时间:2015-04-10 20:25:12

标签: ruby-on-rails ruby-on-rails-4 sqlite

我试图在数据库级别添加验证。对于模型文件,它没有问题,但现在对于迁移文件,我只是不知道如何做到这一点。我正在使用SQLite进行开发(遵循Hartl的教程,但是根据我自己的应用程序调整说明)。

我有以下两个迁移文件:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|

      t.string  :email,           null: false
      t.string  :email_confirm,   null: false
      t.string  :username,        null: false
      t.text    :bio
      t.string  :location,        null: false
      t.boolean :activated,       default: false
      t.datetime :activated_at

      t.timestamps             null: false
    end
  end
end

class AddIndexToUsersEmailAndUsername < ActiveRecord::Migration
  def change
    add_index :users,  :email,         unique: true
    add_index :users,  :username,      unique: true
  end
end

但是验证不会在schema.rb中结束:

ActiveRecord::Schema.define(version: 20150410200022) do

  create_table "Users", force: :cascade do |t|
    t.string   "email"
    t.string   "email_confirm"
    t.string   "username"
    t.text     "bio"
    t.string   "location"
    t.boolean  "activated"
    t.datetime "activated_at"
    t.datetime "created_at",    null: false
    t.datetime "updated_at",    null: false
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["username"], name: "index_users_on_username", unique: true

end

因此null:falsedefault:false不在schema.rb中,并且显然Rails没有实现这些验证。我应该如何在迁移文件中实现这些验证?

我也尝试使用change_column_nullchange_column_default,但使用相同的结果/ schema.rb。

1 个答案:

答案 0 :(得分:0)

Rails确实允许您向迁移中的列提供nulldefault个选项。

编辑用户迁移文件后,您是否重新运行它?

您可以rake db:rollback后跟rake db:migrate

如果您最后一次运行CreateUsersAddIndexToUsersEmailAndUsername,那么您应该使用rake db:rollback STEP=2

这两个步骤进行回滚