默认值以及唯一性验证

时间:2014-02-18 07:36:17

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我有一个name属性为唯一的Path模型。我想将默认值设置为'/'  同样的。 我已按以下方式完成。

class Path < ActiveRecord::Base
  attr_accessible :name

  validates :name, presence: true, uniqueness: true

  before_validation :set_default_path

  private

  def set_default_path
    self.name = name.presence || '/'
  end
end

域模型设计为:

class Domain < ActiveRecord::Base
  attr_accessible :name, path_id

  validates :name, :path_id, presence: true
  validates :name, uniqueness: {scope: :path_id}
end

但是这对于路径空白名称的连续插入不起作用。

path = Path.find_or_create_by_name('')

domain = Domain.new(name: 'stackoverflow.com')
domain.path = path
domain.save!  # Fails with validation error
 ActiveRecord::RecordInvalid:
   Validation failed: Path can't be blank

有没有一种强有力的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

您应该删除以下回调

before_validation :set_default_path

并使用以下名称验证: -

validates :name, presence: true, uniqueness: true, :if => 'name.present?'

并编写一个迁移文件,将默认值添加到路径表的name属性中,如下所示: -

change_column :paths, :name, :string, :default => '/'

change_column_default :paths, :name, '/'

答案 1 :(得分:0)

在验证时添加条件:

validates :name, presence: true
validates :name, uniqueness: true, unless: proc { |e| e.name == "/" }