Rails多表继承问题

时间:2009-10-28 21:46:01

标签: ruby-on-rails

我开始实施MTI解决方案并提出一个基本问题。我有3个物理模型 - SMSNotifications,EmailNotifications,TwitterNotifications,它们是通知的子类。有时在我的代码中,我想说Notifications.find(:all),以便我可以按创建时间排序得到一组结果。然后我想根据他们的子类做事。编写Notifications.find(:all)并让Rails查看子类表并组合结果的方法是什么?现在Rails仍然认为我的物理通知表违背了我的MTI设计。

我也在考虑我应该使用STI的可能性。我可能每行有10个空列但如果获取所有通知需要查询每种类型的通知,那么我觉得这可能是个大问题。

谢谢!

4 个答案:

答案 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

我发现它非常有用!我(顺便说一句)欢迎社区在问题和测试,代码清理等方面提供任何帮助!我知道这是很多人都会喜欢的东西。

请确保定期更新,但正如我所说,它一直在改善/发展。

相关问题