ActiveRecord在迁移文件中添加评级范围

时间:2014-12-09 01:57:46

标签: ruby-on-rails activerecord

class AddRatingToBooks < ActiveRecord::Migration
  def up
    add_column :books, :rating, :integer
  end

  def down
    remove_column :books, :rating
end

我在db/migrate/中有以下代码段,我正在尝试将ratings添加到我的books表中,它位于范围内来自 0-100 ,但我不知道如何在这里添加,我所能找到的只是查询范围。我确定这很简单,我还没有。

2 个答案:

答案 0 :(得分:3)

您无需在迁移文件中指定整数值范围。迁移文件仅用于添加数据库列以存储评级。这不是添加验证的地方。

您应该使用Book模型指定验证,以确保ratings落在特定范围内。像这样:

class Book < ActiveRecord::Base
  validates :rating, :inclusion => { :in => 0..100 }
end

我强烈建议您阅读migrationsvalidations上的Rails指南。

答案 1 :(得分:3)

可能我的答案太迟了。但是可以使用Migration Validators项目在db级别上定义验证:https://github.com/vprokopchuk256/mv-core

例如,在您的迁移中:

def change
  change_table :books do |t|
    t.integer :rating, inclusion: 0..100
  end
end

然后在你的模型中:

class Book < ActiveRecord::Base
  enforce_migration_validations
end

结果您的验证将在db(作为触发器或检查约束内的语句,取决于您的数据库)和模型中定义

SQL(PostgreSQL):

=# insert into books(rating) values(10);
INSERT 0 1

=# insert into books(rating) values(200);
ERROR:  new row for relation "books" violates check constraint  "chk_mv_books_rating"

Rails控制台:

Book.new(title: 10).valid?
=> true

Book.new(title: 200).valid?
=> false