4

私は次のコードを持っています:

class Foo
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name
  validates :name, uniqueness: true
end

ただし、私が受け取る一意性の検証をテストする場合、次のようになります。

/Users/neil/.rvm/gems/ruby-1.9.3-p286@config-keeper/gems/activemodel-3.2.9/lib/active_model/validations/validates.rb:96:in `rescue in block in validates': Unknown validator: 'UniquenessValidator' (ArgumentError)
    from /Users/neil/.rvm/gems/ruby-1.9.3-p286@config-keeper/gems/activemodel-3.2.9/lib/active_model/validations/validates.rb:93:in `block in validates'
    from /Users/neil/.rvm/gems/ruby-1.9.3-p286@config-keeper/gems/activemodel-3.2.9/lib/active_model/validations/validates.rb:90:in `each'
    from /Users/neil/.rvm/gems/ruby-1.9.3-p286@config-keeper/gems/activemodel-3.2.9/lib/active_model/validations/validates.rb:90:in `validates'
    from /Users/neil/code/open_source/config_keeper/app/models/foo.rb:8:in `<class:App>'

これは少し奇妙に思えます。何が間違っているのかについてのアイデアはありますか?

4

2 に答える 2

7

ルビーのオブジェクトスペースを活用して、次のことを行うことができます。

class Foo
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name
  validate do
    if self.name && ObjectSpace.each_object(self.class).select{|o| o.name == self.name }.size > 1
         errors.add(:name,"not unique") 
    end
  end
end

a = Foo.new
b = Foo.new
a.valid? #=> true because of if self.name
a.name = "bar"
a.valid? #=> true because of .size > 1
b.name = "bar"
a.valid? #=> false
b.valid? #=> false

これは基本的に、一致する(またはのサブクラスである)すべての生きているオブジェクトをウォークオーバーしますFoo

于 2012-12-15T13:06:17.913 に答える
1

API:

validates_uniqueness_of :name

アップデート:

validate do
  #uniqueness code
end
于 2012-12-15T12:48:22.107 に答える