2011-10-17 66 views
1

的兩代人之間真實的關係,使用Rails 3.1.1的Rails:造型複雜的關聯,以適應動物

我模擬動物(狗個人)和凋落物(後代的羣體)之間的關聯。它變得複雜,因爲動物都出生在一個垃圾家長可以多胎(無論是作爲母親父親)。

這裏是我的架構的相關部分:

ActiveRecord::Schema.define do 

    create_table "animals", :force => true do |t| 
    ... 
    t.integer "litter_id" 
    t.string "sex" 
    ... 
    end 

    create_table "litters", :force => true do |t| 
    ... 
    t.integer "father_id" 
    t.integer "mother_id" 
    ... 
    end 
end 

,這裏是合適的機型,擁有什麼,我認爲可以工作作爲協會:

class Animal < ActiveRecord::Base 
    ... 
    belongs_to :litter 
    has_many :litters, :foreign_key => :father_id 
    has_many :litters, :foreign_key => :mother_id 
    has_one :father, :through => :litter, :foreign_key => :father_id 
    has_one :mother, :through => :litter, :foreign_key => :mother_id 
    ... 
end 

class Litter < ActiveRecord::Base 
    ... 
    has_many :animals 
    belongs_to :father, :class_name => 'Animal' 
    belongs_to :mother, :class_name => 'Animal'  
    ... 
end 

我將運行如果我在其各自的模型中將belongs_tohas_many關聯加倍,那麼它們會出現問題?如果是這樣,我該如何正確建模這些關聯?


UPDATE:正如下面的評論中提到,我使用的產仔模型跟蹤約10個屬性是共同的每一種動物在垃圾。這個軟件將由狗飼養員運行,所以垃圾本身就是一個相關的單元,從幾個角度來看,當涉及到在視圖中呈現數據時,它會帶來很多的負擔(超越父母/孩子的關係)。

回答

0

你應該能夠只是把所有的狗爲動物。

每個動物會像這樣(未經):

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_idfather_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 

這將使你指定的動物的所有兄弟姐妹的名單,不包括動物本身。

+0

無論如何,我都想跟蹤有關Litters的數據,這是有理由的(在這個問題的範圍之外)。鑑於無論如何都會有一個Litter模型,是不是最好重複一下母親/父親組合,以確定該窩裏的每隻小狗都分享? (這並不意味着我是一個非常正常的數據結構,因爲更新一個垃圾的父親,例如,然後需要更新該垃圾中每個動物的記錄...但我不是專家。) – jasonmklug

+0

I這取決於你的軟件模型反映了真實世界的多少/你想要建模哪種情況。我的意思是,你父親什麼時候改變?它會在動物的創造(誕生)時被設定,並且永遠不會改變,正確嗎?我認爲,我們不是在談論離婚,繼父和類似的事情嗎?我認爲有可能知道一條狗是活着的,但不知道它的父親是誰(這意味着它會以「零」開始並最終變成某種東西),所以在那種情況下,是的,將「垃圾」作爲中間對象是完全有效的。 – jefflunt

+0

父親不一定會改變 - 這只是一個屬於恰好在可能*改變的問題範圍內的屬性。垃圾列將包括諸如'expected_birth_date','breed_id','notes'等等(並非所有這些都會改變,顯然,但其中的一些可能)。我的'litters'表中有10列,所以這是一個重複的數據,在一個給定的垃圾中''動物'的所有_always_共有。 – jasonmklug

0

不知道任何Ruby,Rails的ActiveRecord的或的,我還是覺得你需要一個圖形庫(數據結構不是畫面),並存儲爲你一個持久層。 Here是一個Ruby圖形庫,持久化在你身上。

+0

是的,當我點擊主頁時,碰巧看到這個名單位於列表頂部。如果@normalocity是正確的,請不要在乎我。 JAPH –

+0

或者他刪除了評論,也許我應該站在我的立場(哇,我覺得不合適:-P) –