2011-03-12 54 views
0

我試圖做一個應用程序,其中用戶有很多項目,並且他們通過擁有每個項目都是一個實體。這背後的想法是,如果我有一個MacBook項目,例如,用戶將其添加到他們的庫存,他們可能會應用屬性(照片,評論,標籤等),而不直接影響他們項目本身,只有他們的佔有。has_many:通過對象inehertiance

該項目將依次彙總其相應的財產(如果你去/ item/MacBook,而不是/ user/101 /擁有/ 5)屬性。我有以下模型設置(忽略像現在的照片屬性)。

class User 
    has_many :possessions 
    has_many :items, :through => :possessions 
end 

class Item 
    has_many :possessions 
    has_many :users, :through => possessions 
end 

class Possession 
    belongs_to :user 
    belongs_to :item 
end 

我的第一個問題是,我是否正確地做這件事。 has_many:通過正確的工具在這裏?

如果是這樣,我會如何處理類繼承?我可能沒有說明這一權利,但我的意思是,如果我這樣做

@possession = Possession.find(params[:id]) 
@photos = @possession.photos.all 

,有沒有可用的照片,怎麼會回落到相應的項目和搜索屬於照片它?

回答

0

您的初始數據結構看起來很合適。

至於第二部分,隨着「回退」到相應的項目,我不認爲會有這樣做的直接活動記錄方式。這種行爲看起來很具體,並且可能會讓未來開發應用程序的開發人員感到困惑,除非您有明確的方法。

可以Possession創建一個方法,如:

def photos_with_fallback 
    return self.photos if self.photos.size > 0 
    self.item.photos 
end 

有一個巨大的後果來這樣做。如果你有這樣的方法,你將不能像@photos.build@photos.create那樣沿着像Wrode那樣進行任何寫作活動,因爲你不知道你把它們放在哪裏。他們可以鏈接到ItemPosession

我認爲你最好將條件邏輯推送給你的控制器,然後檢查Posession上的照片,然後再檢查Item上的照片。

#In the controller 
@photos = @posession.photos 
@photos = @posession.item.photos if @photos.size == 0 

這將是更清楚當你去以後,保持你的代碼,它可以讓你做出其他決定的道路。