如何限制列的值

dam*_*uar 12 ruby-on-rails

我想限制字段的可用值.因此,列的值必须来自指定的值集.是否可以使用迁移/模型?或者我必须在我的数据库中手动完成?

Jor*_*ing 26

你将使用验证.这个主题一个完整的Rails指南.在这种情况下:inclusion,您正在寻找的具体帮助者是,例如:

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

编辑2015年8月:从Rails 4.1开始,您可以使用enum类方法.它要求您的列是整数类型:

class Person < ActiveRecord::Base
  enum relationship_status: [ :single, :married, :divorced, :other ]
end
Run Code Online (Sandbox Code Playgroud)

它也会自动为您定义一些方便的方法:

p = Person.new(relationship_status: :married)

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

p.single!
p.single? # => true
Run Code Online (Sandbox Code Playgroud)

您可以在enum此处阅读文档:http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html

  • 您可以在数据库级别设置约束 - 例如,MySQL和PostgreSQL的列类型为"ENUM",但SQLite和Oracle不支持 - 但Rails不直接支持它们.您可以使用不受支持的列类型,例如`t.column:col_name,'CUSTOM SQL TYPE',但是您最终会对这些值进行大量自定义处理,并且您将无法在不同的RDBMS,这就是为什么(除其他外)文档特别警告它. (2认同)