2012-11-20 67 views
2
class Upload < ActiveRecord::Base 
    has_many :comments 
end 

class Gallery < Upload 
    has_many :images 
end 

class MusicAlbum < Upload 
    has_many :audio_tracks 
end 

應該按預期工作嗎?將Gallery和MusicAlubm模型繼承:來自其父級的評論關聯(Upload)並添加自己的?Rails STI - 子類中的自定義關聯

+1

聲明基類中所有關聯的一個原因是能夠在加載上載時急切加載所有關聯。換句話說,我可以做'''Upload.all include:[:comments,:images,:audio_tracks]''' –

回答

4

是的,模型只是類,並且當繼承它們時,它們將獲得父類的所有方法。所以,既GalleryMusicAlbumUpload模型的後裔,他們將有has_many :comments協會,都將從uploads分貝表中獲取數據(這需要有一個type列支持STI這種模式)

一個不錯的可以找到簡單的STI示例here

+0

我不擔心繼承方法,更多的是關於反射的東西。我擔心像Rails這樣的問題,期望所有關聯都在基類上定義,並反映了僅此類的關聯。 該示例不會自定義子類中的關聯。你有沒有試過這個「真正的」項目?它沒有問題嗎? –

+0

關聯只是由Rails生成並以某種方式工作的方法的列表。所以是的,它確實有效,無論這個關聯是在哪裏聲明的 - 在模型本身或它的父項中。實際上,你甚至可以在一個模塊中聲明它,並將該模塊包含到你的類中。 – alony

+0

這對Module很有趣,他們只記得在包含類的上下文中使用「包含」或「擴展」回調函數。你是否知道在模塊中定義關聯方法的方法,以便它可以包含在模塊中(沒有回調?)。 有很多定義的方法,我知道的很多。否則,Model.reflections將如何工作? –