Вы должны иметь возможность просто относиться ко всем собакам как к животным.
Каждое животное пойдет примерно так (не проверено):
belongs_to :mother, :class_name => "Animal", :foreign_key => "mother_id"
belongs_to :father, :class_name => "Animal", :foreign_key => "father_id"
has_many :children, :through => :animals # not sure if you need a foreign key specification here
таблица животных:
id | mother_id | father_id
У самого старого предка, которого вы отслеживаете, не будет родителей, поэтому их mother_id
и father_id
будут равны нулю.
Единственная причина, по которой я могу отслеживать отслеживание litter_id
это следить за братьями и сестрами, которые могут быть чем-то, что вам нужно.В этом случае вы можете сделать так, чтобы мусор был его собственным объектом, как в вашем примере, или вы можете сделать простую проверку, например:
class Animal < ActiveRecord::Base
...
def is_sibling_of(animal)
self.mother == animal.mother
end
...
end
... или объект scope
(был назван named_scope
до Rails3):
class Animal < ActiveRecord::Base
...
scope :siblings, lambda {|animal| {:conditions => ["id not in (?) AND mother_id = ?", animal.id, animal.mother.id} }
...
end
Что даст вам список всех братьев и сестер указанного животного, кроме самого животного.