【发布时间】:2011-05-03 08:11:48
【问题描述】:
我只是在学习 Rails。我非常喜欢 Rails。在几乎所有情况下,它都彻底摧毁了 Java 和相关的生产力解决方案——而且我真的对拥有十多年经验的 Java 感到非常震惊……所以这说明了一些事情!如果 rails 不能做到这一点,那么那里有一块宝石让我大吃一惊。
然后是主动关系。我正在努力将其用作我的主要查询方法,但这是不行的。我发现一旦我开始构建需要 2 个连接的查询,我就会开始收到奇怪的错误消息,这些错误消息没有意义……老实说,所有范围都很难推理。
虽然这种方法可能会使事情更具可读性,但我认为从全局角度推理正在发生的事情的成本......以及编写查询的成本......可能不会为自己付出代价。如果你真的很擅长 sql... 或者 hql 之类的语言... 这种做事方式实际上是一种生产力损失。至少对我来说是这样。
我可以忍受它,但我无法使用嵌套连接。例如,如果我有 ABC,并且 B 是一个也是多对多关系的模型,ActiveRelation 会抱怨其中一个外键的名称是错误的......即使它是实际上是正确的。我认为这是一个错误。所有使用范围进行单连接的查询都可以完美地工作......但是如果您将这些相同的范围组合起来进行 2 次连接,它就会失败。我看不出有什么办法解决。
我可以只做一个连接,然后让 ORM 为我做剩下的事情……但这会浪费性能。对于一个大网站来说,这将以灾难告终。我正在编写一个庞大的系统,每个请求存储数千个关系数据树。使用 ORM 遍历图表是一个性能杀手,我什至不会费心继续编写应用程序的其余部分。如果是这种情况,我可能不得不回到 Java。
除此之外,我在网上找不到任何多个连接的示例。甚至文档也几乎没有提到连接和合并。
那么……它准备好迎接黄金时段了吗?如何在 Rails 中进行真正复杂的 7-9 表连接? Rails 不是为此而构建的吗?我之所以这么问,是因为如果 Rails 无法处理这种类型的查询,我将不得不停止使用它……相信我……这是一个巨大的、真正的耻辱……因为我绝对喜欢其他一切。我真的希望我是错的,一切都很好。
【问题讨论】:
-
很难说,如果你能在 7-9 表的情况下展示一个具体的例子,也许你可以从别人那里得到你做错的想法,我没有看到任何技术使用 arel 进行复杂连接的障碍,只需要了解其背后的代码,打开 arel gemfile 并在您不了解它时阅读源代码。它支持您在 java 中使用的相同 mysql,因此没有什么不同。关于您的 a-b-c 问题,当您设置查询时,最好将您的键与表名一起定义,例如
"b.foreign_key" -
这是一个很好的例子,说明文档不是很清楚。 API 显然有多种方法可以做同样的事情,文档和 railscasts 提倡将这些范围链接在一起作为“最佳”实践......但事实证明这不是你应该为连接做的,因为它没有像你想的那样工作。这里有一个例子:stackoverflow.com/questions/5865426/…
标签: sql ruby-on-rails database activerecord