Как ограничить значения для столбца

Я хочу ограничить доступные значения для поля. Таким образом, значение столбца должно быть от заданного набора значений. Возможно ли использование миграции/моделей? Или мне нужно сделать это вручную в моей БД?

Ответ 1

Вы будете использовать проверки для этого. Там весь путеводитель Rails по теме. Конкретный помощник, который вы ищете в этом случае, :inclusion, например:

class Person < ActiveRecord::Base
  validates :relationship_status,
    :inclusion  => { :in => [ 'Single', 'Married', 'Divorced', 'Other' ],
    :message    => "%{value} is not a valid relationship status" }
end

Редактировать Aug. 2015: В Rails 4.1 вы можете использовать метод класса enum для этого. Для этого требуется, чтобы ваш столбец был целым типом:

class Person < ActiveRecord::Base
  enum relationship_status: [ :single, :married, :divorced, :other ]
end

Он автоматически определяет некоторые удобные для вас методы:

p = Person.new(relationship_status: :married)

p.married? # => true
p.single? # => false

p.single!
p.single? # => true

Вы можете прочитать документацию для enum здесь: http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html

Ответ 2

Это зависит от того, сколько вам нужно. Вы могли бы просто добавить валидатор к своей модели, чтобы ограничить его этими значениями, но тогда вы не будете уверены, что существующие данные будут соответствовать (и вызовут последующие сбой из-за проверки), а также другие изменения могут быть сделаны другими приложениями /raw sql, который обойдет его.

Если вы хотите абсолютной уверенности, используйте базу данных.

Здесь вы можете использовать, если вы делаете это в базе данных (что довольно ограничено по сравнению с тем, что может сделать валидатор рельсов: http://www.w3schools.com/sql/sql_check.asp