有效地组合和查询多个表STI与MTI

问题描述

|| 在我的Rails项目中,我有几种内容类型,比如说“文章”,“采访”和“评论”。 在计划项目时,我决定为所有这些使用单独的表(多个表与单个表),这是因为尽管这些内容类型确实共享一些共同的字段(标题,预告片等),但它们也具有唯一的字段每种内容类型。 在我的项目中,我设法使所有这些工作正常进行,但这样做遇到了一些障碍。也就是说,假设我想按发布日期的顺序显示所有这些内容类型(例如在类别页面上),而我只需要显示它们共有的字段(标题,预告片等) ...这是有问题的。 我使用了has_many_polymorphs插件已有一段时间,但从未在Rails 3上对其进行正式更新,而我在R3上使用了一个分叉的分支“ hacked”。无论如何,它会引起问题并时不时地发出奇怪的错误消息,而在我的更新之一破坏了插件之后,我决定放弃它是一个好主意。 然后,我寻找了一个可以像UNION joins一样执行sql插件,但是该插件自2009年以来就没有更新过,所以我忽略了它。 我最终要做的是为每个表进行三个不同的查询,然后使用Ruby合并结果。 (@articles + @reviews +等)效率不高,但是我需要它来工作(这些区域最终可能会被缓存)。 但是,如果我仅可以在单个表上进行查询,这将“容易”,并且仍然有时间重组我的架构,以最有效的方式进行部署。因此,我现在想知道STI是否确实可行,如果是的话,我将如何在两侧使用不同的色谱柱来解决这个问题? 更新 我一直在认真考虑这一点...即如何使用STI,但每种类型都有一些唯一的字段。假设我有一个\'Content \'表,其中有我的共享列,例如title,预告片等。然后,我有单独的表,如Article,Review,这些表中有我的唯一列。从技术上讲,我不能创建Content表的那些嵌套属性,或者实际上是Content表的特定类型吗? 更新2 因此,显然,根据我的研究,如果您需要在不同表上使用不同的列,或者对于不同的内容类型需要使用不同的控制器,则STI是一个坏主意。因此,坚持使用多个表和多态是正确的方法。只是不确定我是否能像我应该做的那样有效。 更新3 认为mu是正确的主意,这是查询如此复杂以至于需要find_by_sql的时候之一,我创建了一个\'Content \'模型并进行了以下调用...
@recent_content = Content.find_by_sql(\"SELECT * FROM articles UNION SELECT * FROM reviews ORDER BY published_at DESC\")
而且它的工作原理……确实是通过单个查询返回所有类型。剩下的麻烦是,因为我在Content上调用ActiveRecord,所以以下操作在我的收藏夹中不起作用,部分返回了最近的内容...
<%= link_to content.title,content %>
链接路径\“ content_path不存在。\”这很棘手,因为每个结果都将作为\“ Content \”对象返回,而不是返回其实际类型。那是因为我当然要使用\'Content \'开始上述查询,但是我必须在其中放置\“ something \”才能使activerecord查询正常工作。必须弄清楚如何为不同的内容类型(/ articles /,/ reviews /等)返回适当的路径/对象类型。     

解决方法

分别查询它们并不像您想的那样糟糕。如果它们具有不同的列,并且您需要在视图中显示不同的列,我认为您不能使用sql union将它们组合在一起。对于性能问题,可以使用缓存或优化表。     ,我最近分叉了一个有前途的项目,以在Rails中实现多表继承和类继承。我花了几天的时间对其进行快速开发,修复,注释和文档处理,并将其重新发布为Rails的CITIER类继承和表继承嵌入。 我认为它将完全满足您的需求。 考虑看一下:http://peterhamilton.github.com/citier 我发现它非常有用!我会(顺便)欢迎社区在问题和测试,代码清除等方面的任何帮助!我知道这是很多人会喜欢的。 但是请确保您定期更新,因为就像我说的那样,它每天都在改进/发展。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...