Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 高效组合和查询多个表(STI与MTI)_Mysql_Ruby On Rails - Fatal编程技术网

Mysql 高效组合和查询多个表(STI与MTI)

Mysql 高效组合和查询多个表(STI与MTI),mysql,ruby-on-rails,Mysql,Ruby On Rails,在我的Rails项目中,我有几种内容类型,比如“文章”、“采访”和“评论” 在规划我的项目时,我决定使用单独的表来处理所有这些内容(多个表与单个表),也就是说,虽然这些内容类型共享一些共同的字段(标题、摘要等),但它们也有每个内容类型所特有的字段 在我的项目中,我设法使所有这些都很好地工作,但在这样做时遇到了一些障碍。也就是说,假设我想按照发布日期的顺序(比如在类别页面上)显示所有这些内容类型,我只需要显示它们共同的字段(标题、摘要等),这是有问题的 我使用has_many_polymorphs

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

在规划我的项目时,我决定使用单独的表来处理所有这些内容(多个表与单个表),也就是说,虽然这些内容类型共享一些共同的字段(标题、摘要等),但它们也有每个内容类型所特有的字段

在我的项目中,我设法使所有这些都很好地工作,但在这样做时遇到了一些障碍。也就是说,假设我想按照发布日期的顺序(比如在类别页面上)显示所有这些内容类型,我只需要显示它们共同的字段(标题、摘要等),这是有问题的

我使用has_many_polymorphs插件有一段时间了,但它从未为Rails 3进行过正式更新,我使用了一个分叉分支“hacked”在R3上。不管怎么说,它会引起问题,不时会发出奇怪的错误消息,在我的一次更新破坏了插件后,我决定放弃它

然后我寻找了一个可以执行类似SQL的联合连接的插件,但该插件自2009年以来一直没有更新过,所以我通过了

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

然而,如果我可以只在一个表上进行查询,那么“将”变得更容易,而且仍然有时间重新构造我的模式,以最有效的方式进行部署。所以我现在想知道STI是否真的是一条路,如果是这样的话,我如何在两边都有不同的专栏的情况下逃脱呢

更新

我一直在认真思考这个问题……即如何使用STI,但每种类型都有一些独特的字段。假设我有一个“内容”表,其中有我的共享列,如标题、摘要等。然后我有单独的表,如文章、评论,这些表中有我的唯一列。从技术上讲,我不能创建内容表的嵌套属性,或者实际上是内容表的特定类型吗

更新2

显然,根据我的研究,如果不同的表需要不同的列,或者不同的内容类型需要不同的控制器,那么STI是个坏主意。因此,也许坚持使用多个表和多个变形是正确的方法。只是不确定我做得有多有效

更新3

考虑到mu的想法是正确的,而且现在的查询非常复杂,需要通过sql查找,我创建了一个“内容”模型,并进行了以下调用

@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\u path不存在”。这很棘手,因为每个结果都返回一个“content”对象,而不是它真正是什么类型的对象。这是因为我当然是以“Content”开始上面的查询,但我必须在那里放上“something”以使activerecord查询工作。必须找出如何为不同的内容类型、/articles/、/reviews/等返回适当的路径/对象类型。

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

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

我最近提出了一个很有希望的项目,在Rails中实现多表继承和类继承。我花了几天时间对其进行快速开发、修复、注释和文档编制,并将其作为CITIER类继承和Rails表继承嵌入重新发布

我想这正是你需要的

考虑看一看:

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


但是,请确保您定期更新,因为正如我所说,它每天都在改进/发展。

我最近提出了一个很有希望的项目,在Rails中实现多表继承和类继承。我花了几天时间对其进行快速开发、修复、注释和文档编制,并将其作为CITIER类继承和Rails表继承嵌入重新发布

我想这正是你需要的

考虑看一看:

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


但是,请确保您定期更新,因为正如我所说,它每天都在改进/发展。

您不想进行真正的SQL联合的任何特定原因?我已经考虑过了,但1.)找不到关于如何在Rails中进行联合的详细信息,2.)我认为Rails中的直接SQL查询是一种令人沮丧的做法。另外,我还可以看到STI系统的一些优点,特别是在一些插件调用单个表的情况下。多态关联不需要插件。请参阅的“多元联想”一节,除非它显然不能与has_many/through(如我的分类/分类)一起完成