2009-10-28 88 views
2

我開始實施MTI解決方案並有一個基本問題。我有3個物理模型 - SMSNotifications,EmailNotifications,TwitterNotifications,它們是通知的子類。有時在我的代碼中,我想說Notifications.find(:all),這樣我就可以得到按創建時間排序的一組結果。然後我想根據他們的子類來做事情。如何編寫Notifications.find(:all)並讓Rails查看子類表併合並結果?現在Rails仍然認爲我的物理通知表違背了我的MTI設計。Rails多表繼承問題

我也在考慮應該使用STI的可能性。我可能每行有10個空列,但如果獲取所有通知需要查詢每種通知類型,那麼我覺得這可能是一個大問題。

謝謝!

回答

1

是的,您需要爲每種類型單獨查詢。如果這是一個違規者,那麼你應該採用STI或者你之前提出的混合模式方法。

+0

感謝您的答覆話筒。我認爲STI會更好地工作。現在嘗試... – Tony 2009-10-28 23:37:08

0

爲此,您可以使子類與某些特定模型(X)具有多態關聯。您可以編輯回調after_initialize,以便在創建時將此特定模型X的一個條目與您的每個子類相關聯。通過這種方式,您可以在所提到的多態關聯的目標(X)上執行查找。

0

我最近分叉了一個有前途的項目來實現Rails中的多表繼承和類繼承。我花了幾天的時間對它進行快速開發,修復,評論和文檔化,並將它重新發布爲CITIER類繼承和Rails表繼承嵌入。

我認爲它應該允許您通過詢問所有通知來執行所需的操作,它仍會返回正確的模型。如果你做的是這樣

Notification.all().each do |n| 
    if n.class == 'EmailNotification' 
    #Do something 
    end 
end 

甚至定義根Notification類的函數,並重載它的子類返回不同的東西。

考慮給它一看:http://peterhamilton.github.com/citier

我發現它非常有用!我會(順便說一句)歡迎社區在問題和測試,代碼清理等方面的任何幫助!我知道這是很多人會喜歡的。

請確保您定期更新,因爲正如我所說,它一直在改進/演變的一天。

1

如果使用https://github.com/hzamani/acts_as_relation

rails g model notification notification_type:string notification_id:integer <other columns> 
rails g model email_notification <columns> 

class EmailNotification < ActiveRecord::Base 
    acts_as :notification 
end 
.... 

,那麼你想要的代碼可能是這樣的:再次

Notification.all.each do |n| 
    case n.notification_type 
    when "EmailNotification" 
    ... 
    when "SMSNotification" 
    ... 
    end 
end