2013-11-02 39 views
0

我在Rails中遇到以下問題,我不知道如何解決。我構建了一個測試Web應用程序,一個包含房地產廣告的公告牌,如簡單版本的http://www.trulia.com/,顯然,用戶可以在網站上添加廣告,然後他們可以在他們的「辦公室」中找到廣告,問題出現在哪裏。我有8種類型的廣告,如單位,辦公室,車庫等,所以我需要能夠檢索屬於某個特定用戶的廣告,而且我不想向所有8個表格發出sql請求以顯示此用戶的廣告,例如,如果用戶只有一個廣告銷售公寓, 所以我需要的東西,而不是對Rails數據庫的靈活請求

@garages = Garage.where("user_id = #{current_user.id}") 
@flats = Flat.where("user_id = #{current_user.id}") 
@offices = Office.where("user_id = #{current_user.id}") 
..... and so on 

我有用戶模式,使所有廣告屬於某個用戶,我想創造這將屬於用戶多態表,幷包含所有廣告用戶邀請 它的信息將被命名爲例如「廣告」,它將具有3列,user_id,advertisable_id,advertiseble_type,並且獲得屬於某個特定用戶的所有行是非常容易的,但是我不知道它是否可能做出Rails只從那些位於「advertisable_type」中的表格和來自「advertisable_id」的那些表格獲得廣告,我希望你明白我的意思。那麼,爲新手提供什麼建議? :)

回答

0

如果您現有的模型車庫,平面,辦公室真的是廣告,共享很多相同的邏輯和列,然後顯然你需要一個數據重新設計。

如果99%是同樣的事情,爲什麼不是隻有Advertisement表和一列advertisement_type?如果您想要廣告類型的分類器,只需使用單獨的表格/型號AdvertisementTypes並在您的advertisements表格中引用advertisement_type_id

如果你覺得有很多共同點,但也會有很多不同的邏輯,這可能是STI (Single table inheritance)的理想情況。 使用STI時您有不同的模型類,它們從相同的父類繼承並存儲在同一個表中。

class Advertisement < ActiveRecord::Base 
    def ad_text 
    "We are selling property: #{read_attribute(:ad_text)}" 
    end 
end 

class GarageAdvertisement < Advertisement 
    def ad_text 
    "We are selling garage: #{read_attribute(:ad_text)}" 
    end 
end