2014-12-09 4 views
0
class AddRatingToBooks < ActiveRecord::Migration 
    def up 
    add_column :books, :rating, :integer 
    end 

    def down 
    remove_column :books, :rating 
end 

나는 내 db/migrate/의 코드 조각 다음, 나는 그것이 0 ~ 100에서 범위에있을 것입니다 내 books 테이블에 ratings를 추가하는 것을 시도하고있다,하지만 여기에 추가하는 방법을 모르겠다. 찾을 수있는 것은 범위를 쿼리하는 것이었다. 나는 그것이 아직 간단하지 않다는 것을 확신한다.액티브

답변

3

마이그레이션 파일에 정수 값의 범위를 지정할 필요가 없습니다. 마이그레이션 파일은 단순히 등급을 저장하기 위해 데이터베이스 열을 추가하는 데 사용됩니다. 이는 유효성 검사를 추가 할 장소가 아닙니다.

ratings이 특정 범위 내에 있음을 확인하는 유효성 확인을 지정하려면 Book 모델을 사용해야합니다. 이런 식으로 뭔가 :

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

내가보기 엔 레일을 읽는 것이 좋습니다는 migrationsvalidations 모두 안내합니다.

+0

참, 내가 잘못된 장소에 있었다 생각. 하하. 고마워. 그게 효과가 있다고 생각해. – Diego

+0

그래. 일단 당신이 그것을 작동하게되면, 당신의 질문에 대답한다면 대답을 받아 들일 수 있다고 생각하십시오 :) –

+0

나는 전에 받아 들여진대로 대답을 만들지 않았습니다, 어떻게 그렇게합니까? 그건 그렇고, 난 그냥 코드를 tweeted하고 당신의 대답은 잘 작동했다 =) 나는 흥분된다. @JoelBrewer – Diego

3

아마도 나는 대답이 너무 늦었습니다. 마이그레이션에 예를 들어 https://github.com/vprokopchuk256/mv-core

: :하지만 마이그레이션 검사기 프로젝트와 DB 수준에서 검증을 정의하는 것이 가능

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 (Postgre SQL) :

=# 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" 

레일 콘솔 :

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

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