validates_uniqueness_of missing in rails 3.0 rc2?

Has anybody noticed validates_uniqueness_of missing in rails 3.0 rc2? I’m not sure if this is a bug or I’m just doing something wrong.

Here’s what I’m doing.

Class 1:

class Title < ActiveRecord::Base

validates_length_of :language, :is => 3

validates_uniqueness_of :language, :scope => :book_id

validate :language, :is_proper_language_code

validates_presence_of :value

belongs_to :book

def is_proper_language_code

errors.add(:base, “invalid language code”) unless !ISO_639::ISO_639_2.find{ |lang| lang[0] == self.language }.nil?

end

end

Class 2:

class Book < ActiveRecord::Base

attr_accessible :titles

validates_presence_of :titles

has_many :titles

end

Spec:

before(:each) do

@valid_title_attributes = {:book_id => 1, :language => “eng”, :value => “…”}

@book = Book.new

@book.titles.push(Title.new(@valid_title_attributes))

end

it “should not have multiple titles with same language attribute” do

@book.titles.clear

@book.titles.push(Title.new(@valid_title_attributes))

@book.titles.push(Title.new(@valid_title_attributes))

@book.should_not be_valid

@book.titles.clear

@book.titles.push(Title.new(@valid_title_attributes))

@book.should be_valid

end

Has anybody noticed validates_uniqueness_of missing in rails 3.0 rc2? I’m not sure if this is a bug or I’m just doing something wrong.

It’s still in there, as far as I can see. If it had been removed, you’d get an error when you try to call ‘validates_uniqueness_of’.

Here’s what I’m doing.

Class 1:

class Title < ActiveRecord::Base

validates_length_of :language, :is => 3

validates_uniqueness_of :language, :scope => :book_id

validate :language, :is_proper_language_code

validates_presence_of :value

belongs_to :book

def is_proper_language_code

errors.add(:base, “invalid language code”) unless !ISO_639::ISO_639_2.find{ |lang| lang[0] == self.language }.nil?

end

end

Class 2:

class Book < ActiveRecord::Base

attr_accessible :titles

validates_presence_of :titles

has_many :titles

end

Spec:

before(:each) do

@valid_title_attributes = {:book_id => 1, :language => “eng”, :value => “…”}

@book = Book.new

@book.titles.push(Title.new(@valid_title_attributes))

end

it “should not have multiple titles with same language attribute” do

@book.titles.clear

@book.titles.push(Title.new(@valid_title_attributes))

@book.titles.push(Title.new(@valid_title_attributes))

@book.should_not be_valid

@book.titles.clear

@book.titles.push(Title.new(@valid_title_attributes))

@book.should be_valid

end

I assume the problem is that “@book.should_not be_valid” is failing? The uniqueness validator works by querying the database for other matching records. So if you’re just creating titles in memory, and not saving them, the uniqueness validator won’t complain about them. Try changing your 'Title.new’s to ‘Title.create’.

Chris