Setting object most prefered from has_many

I'd create a table (as persons) related to another (as animals), to selecting the animals prefered for each person but indicating too wich is the most prefered. My idea would be use 'has_many' to relating some animals and 'has_one' for the most prefered (that would not be in the another relation).

Do you know another solution better that this? Thanks in advance!

two of them:

1) make it an acts_as_list and allow to sort animals by preference (but lots of more work)

2) just have a flag prefered in animals then in persons

class Person < ActiveRecord::Base   has_many :animals do     def prefered       find(:first, :conditions => {:prefered => true})     end   end

But with this option, does each person could have a different prefered animal?

Kless wrote:

2) just have a flag prefered in animals then in persons

class Person < ActiveRecord::Base   has_many :animals do     def prefered       find(:first, :conditions => {:prefered => true})     end   end

But with this option, does each person could have a different prefered animal?

the way you described your setup: animal belongs_to person

would mean, that a animal record can belong to only one person so i assumed, that you talk about 'named' animals so a person has a cat named "foo" another person a cat named "bar"

if you want to have a set of animals (horse, cat, dog) of which each person can chose some and set one as prefered you would need a habtm relationship each person can have many animals each animal can belong to many persons

in your case, where you need additional information (prefered) you should create an intermediate model

PersonsAnimals   belongs_to :person   has_many :animals

and keep the prefered flag and it's finder method in this model and of course you can make use og :through

Person   has_many :persons_animals   has_many :animals :through => :persons_animals

Kless wrote:

But with this option, does each person could have a different prefered animal?

Not easily. There is no way (AFAIK) to put a relationship between two relations in Rails that enables the related has_many model to remain independent of the primary model. I'm happy to be proven wrong...

One solution is to override methods in your Person model for setting the animals and preferred animal. These methods can do the validation, so setting the preferred animal checks it is contained in the animals list and removing an animal from the animals list can check if it is the preferred animal (and either fail or remove the preferred animal depending on how you want it to function).

Your unit tests will be important here...

Mark Bush wrote:

Not easily. There is no way (AFAIK) to put a relationship between two relations in Rails that enables the related has_many model to remain independent of the primary model. I'm happy to be proven wrong...

OK, yes, I missed the fact this is really (by the sound of it) a has_and_belongs_to_many relationship and so Thorsten is obviously right. An intermediate relationship is the way to go. Preference is then defined there.

Thank you very much for the help.