【问题标题】:Is ActiveRelation ready for prime time?ActiveRelation 准备好迎接黄金时段了吗?
【发布时间】: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


【解决方案1】:

说实话,我可以联系一下,但事实是,我们大多数时候不知道如何处理事情并感到沮丧。学习曲线陡峭的 Rails 就是一个很好的例子 :) 有一次我试图做一个左外连接,它看起来很乱,结果发现我可以用一种更干净的方式来做。

一旦你学会了如何使用 Rails,Rails 实际上可以进行各种连接(根据我的经验,这确实是一个挑战)。

我发现有时使用一点 Ruby 可以使过程更容易。一张小地图可能会拯救整个事情。

然而,当你不能做某事时,并不是因为 Rails 没有处理它,而是因为你还没有正确地做这件事的知识。 Rails 很难,有些东西看起来很不清楚,只是因为你一开始并不了解它们。

关于 A、B、C 的事情,它应该可以正常工作。很有可能(如果不确定),您在命名键时做错了(您可以 100% 确定这不是 Rails 错误 :)

【讨论】:

  • 根据我的经验,我想说除了 ActiveRelation 之外的一切都容易得多。我从没想过Java真的很难,只是不必要的冗长乏味。我实际上想用看起来更像 HQL 的东西替换查询机制。我会立即富有成效,在这一点上我绝对会很高兴。我最近才弄清楚如何进行 2 表连接,但您不能重用范围。我的猜测是调用 merge() 或 joins() 两次会导致同一个查询出现问题。也许不是错误,但它应该支持具有多个连接条件的嵌套范围:(
  • 我想我只是遇到了一个问题,即直观的设计不是它的工作方式。我的意思是,如果它适用于 1 个连接......你自然会认为它对两个“只适用”......但事实并非如此。要进行 2+ 表连接,您实际上必须以不同的方式处理它。这种 API 笨重且令人困惑。至少对于 Hibernate,它对于 1 到 70 个连接是一致的。
  • 一般来说,你可以做类似 :joins => [:model1, :model2] 的事情,我认为这也可以在嵌套范围内工作(但你总是必须特别尝试一些事情)。请注意,有时调用范围的顺序很重要。如果一个作用域直接影响另一个作用域,则它必须先行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2013-09-08
  • 2011-05-27
相关资源
最近更新 更多