validate sub models in parent model?

class Foo < ActiveRecoed::Base
  has_many :www_links, :as => :owner
end

class WwwLink < ActiveRecord::Base
  belongs_to :owner, :polymorphic => true
  attr_accessible :href
end

I want to ensure that each Foo instance does not have same links (href).

My first attempt would be to write validation in Foo that checks all its
www_links. But then I would also have to do it in WwwLink class. That
would not be DRY.

Any other ideas?

class Foo < ActiveRecoed::Base
has_many :www_links, :as => :owner
end

class WwwLink < ActiveRecord::Base
belongs_to :owner, :polymorphic => true
attr_accessible :href
end

I want to ensure that each Foo instance does not have same links (href).

I don't understand what you mean by the above.

Colin

Colin Law wrote in post #971843:

class Foo < ActiveRecoed::Base
has_many :www_links, :as => :owner
end

class WwwLink < ActiveRecord::Base
belongs_to :owner, :polymorphic => true
attr_accessible :href
end

I want to ensure that each Foo instance does not have same links (href).

I don't understand what you mean by the above.

Colin

  test "should not allow for adding two same links" do
    # given
    foo1 = create_foo.save!
    link1 = foo1.www_links.create(:href => 'wp.pl')
    link1.save!

    foo2 = create_foo.save!
    link2 = foo2.www_links.create(:href => 'wp.pl')

    # when
    link2.save!

    # then
    errors occured !
  end

I will put this logic in WwwLinks controller.

So you are just wanting uniqueness of www_link.href? Will not
validates_uniqueness_of in WwwLink class (backed up by a unique
constraint in the database of course) do the job? I think in this
case it will be the foo2.www_links.create that will fail.

Colin

Colin Law wrote in post #971847:

So you are just wanting uniqueness of www_link.href? Will not
validates_uniqueness_of in WwwLink class (backed up by a unique
constraint in the database of course) do the job? I think in this
case it will be the foo2.www_links.create that will fail.
Colin

The constraint is on "owner" and "href", not "href" itself.
I can have multiple links with the same href. But those cannot be with
the same owner_id.

validates_uniqueness_of(:href, :scope => [:owner_type, :owner_id])

That is not what your test says, you have too Foo objects, foo1 and
foo2 and are asking it to fail when you add the link to the second
one.

Colin