我开始实施MTI解决方案并提出一个基本问题。我有3个物理模型 - SMSNotifications,EmailNotifications,TwitterNotifications,它们是通知的子类。有时在我的代码中,我想说Notifications.find(:all)
,以便我可以按创建时间排序得到一组结果。然后我想根据他们的子类做事。编写Notifications.find(:all)
并让Rails查看子类表并组合结果的方法是什么?现在Rails仍然认为我的物理通知表违背了我的MTI设计。
我也在考虑我应该使用STI的可能性。我可能每行有10个空列但如果获取所有通知需要查询每种类型的通知,那么我觉得这可能是个大问题。
谢谢!
答案 0 :(得分:1)
是的,您需要为每种类型单独查询。如果这是一个交易破坏者,那么你应该采用STI或前一个问题中提出的混合模型方法。
答案 1 :(得分: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
答案 2 :(得分:0)
为此,您可以使子类与某个特定模型(X)具有多态关联。您可以编辑回调after_initialize,以便在创建时将此特定模型X的一个条目与每个子类相关联。通过这种方式,您可以对上述多态关联的目标(X)执行查找。
答案 3 :(得分:0)
我最近分配了一个有希望的项目来在Rails中实现多表继承和类继承。我花了几天时间对它进行快速开发,修复,评论和文档处理,然后重新发布它作为Rails的CITIER类继承和表继承嵌入。
我认为它应该允许您通过询问所有通知来执行您所需的操作,它仍将返回正确的模型。如果你要做类似
的事情Notification.all().each do |n|
if n.class == 'EmailNotification'
#Do something
end
end
甚至可以在根Notification类中定义一个函数,并在子类中重载它以返回不同的东西。
考虑一下:http://peterhamilton.github.com/citier
我发现它非常有用!我(顺便说一句)欢迎社区在问题和测试,代码清理等方面提供任何帮助!我知道这是很多人都会喜欢的东西。
请确保定期更新,但正如我所说,它一直在改善/发展。