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?

On 2 January 2011 13:42, Michal B. [email protected] wrote:

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 L. wrote in post #971843:

On 2 January 2011 13:42, Michal B. [email protected] wrote:

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.

On 2 January 2011 14:11, Michal B. [email protected] wrote:

link1.save!

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

when

link2.save!

then

errors occured !
end

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

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])

On 2 January 2011 14:34, Michal B. [email protected] wrote:

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.

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

Colin L. wrote in post #971847:

On 2 January 2011 14:11, Michal B. [email protected] wrote:

link1.save!

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

when

link2.save!

then

errors occured !
end

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.