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

时间:2011-04-13 22:13:24

标签: mysql ruby-on-rails

在我的Rails项目中,我有几种内容类型,比如“文章”,“采访”和“评论”。

在计划我的项目时,我决定使用单独的表来处理所有这些(多个表与单个表),即因为虽然这些内容类型确实共享一些共同的字段(标题,预告片等),但它们也有每种内容类型都有唯一的字段。

我设法在我的项目中完成所有这些工作,但是遇到了一些障碍。也就是说,我想按照发布日期顺序显示所有这些内容类型(比如在类别页面上),我只需要显示它们共有的字段(标题,预告片等)......这是有问题的。

我使用了has_many_polymorphs插件一段时间,但它从未正式更新为Rails 3而且我正在使用一个分叉的分支'黑客'一起用于R3。无论如何,它会导致问题并偶尔吐出奇怪的错误消息,并且在我的一次更新破坏插件后,我认为放弃它是个好主意。

然后我找了一个可以像UNION一样执行SQL的插件,但是这个插件自2009年以来就没有更新过,所以我通过了。

我最终做的是为每个表做三个不同的查询,然后使用Ruby来组合结果。 (@articles + @reviews +等)效率不高,但我需要它才能工作(这些区域最终可能会被缓存)。

但是,如果我只能在一个表上进行查询,那将会更容易,并且仍然有时间重新构建我的架构,以最有效的方式执行此操作。所以我现在想知道STI是否确实是要走的路,如果是这样的话,我将如何通过双方的不同列来解决这个问题?

更新

我一直在考虑这个问题......即我如何使用STI但每种类型都有一些独特的字段。假设我有一个'内容'表,其中我有我的共享列,如标题,预告片等...然后我有单独的表,如文章,评论那些表将有我的唯一列。我不能在技术上制作Content表的那些嵌套属性,或者实际上是Content表的特定类型吗?

更新2

显然根据我的研究,如果您需要在不同的表上使用不同的列,或者如果您需要针对不同内容类型的不同控制器,则STI是个坏主意。所以也许坚持使用多个表和多态是正确的方法。只是不确定我是否像我应该那样有效地做到这一点。

更新3

思考mu有正确的想法,这是查询如此复杂以至于需要 find_by_sql的时候之一,我创建了一个'内容'模型并进行了以下调用... < / p>

@recent_content = Content.find_by_sql("SELECT * FROM articles UNION SELECT * FROM reviews ORDER BY published_at DESC")

它有点工作......它确实用单个查询返回所有类型。剩下的麻烦是,因为我在内容上调用ActiveRecord,以下内容在我的集合中无效,部分返回最近的内容......

<%= link_to content.title, content %>

即链接路径,“content_path不存在”。这很棘手,因为每个结果都作为“内容”对象返回,而不是它实际上是什么类型的对象。那是因为我当然用'内容'开始上面的查询,但是我必须在那里加上“东西”来使activerecord查询起作用。必须弄清楚如何为不同的内容类型,/ articles /,/ reviews /等返回适当的路径/对象类型......

2 个答案:

答案 0 :(得分:0)

单独查询它们并不像你想象的那么糟糕。如果它们有不同的列,并且您需要在视图中显示不同的列,我认为您不能使用sql union来组合它们。对于性能问题,您可以使用缓存或优化表。

答案 1 :(得分:0)

我最近分配了一个有希望的项目来在Rails中实现多表继承和类继承。我花了几天时间对它进行快速开发,修复,评论和文档处理,然后重新发布它作为Rails的CITIER类继承和表继承嵌入。

我认为它会完全符合你的需要。

考虑一下:http://peterhamilton.github.com/citier

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

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