2009-10-28 90 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