问题标签 [arel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2315 浏览

sql - 多个“有”子句炸毁了 Rails 3 / Arel

我想我在 Rails 3 / Arel 中发现了一个错误,但我希望有人能在我尝试修复它和/或提交错误报告之前澄清我的问题。

  • 在一个非常简单的应用程序上,带有一个 Question 模型:(submitter_id: integer, option_count: integer)

我正在使用的代码:

这爆炸了:

取出其中一个“有”子句可以解决问题,并生成正确的 SQL。

任何意见将不胜感激。Arel 和 Rails 3 是边缘版本,上面的错误中列出了修订版。

0 投票
1 回答
2114 浏览

ruby-on-rails - 与 Arel 和 MetaWhere 的多个 LIKE 匹配

我正在将带有 SearchLogic 的 Rails-2.3 编写的应用程序转换为带有Arel 和 MetaWhere 的 Rails-3.0 并且我正在运行一个我不知道如何编写的操作。

旧代码是:

这样做是LIKE对 params[:city] 数组中的每个项目进行匹配。

当只有一个搜索词时,这在 MetaWhere 中很容易:

但是我如何用任意数量的城市写这个?

0 投票
2 回答
1057 浏览

ruby-on-rails - 如果凌乱的控制器更快,为什么 Rails 范围更受欢迎?

我一直在尝试使用范围链接 Arel 查询,而不仅仅是使用我在控制器中编写的一些冗长的逻辑。但是范围比获取所有记录然后用一些逻辑筛选它们要慢。那么,我想知道为什么范围更好。

这就是我正在做的事情:

  • 一个问题有很多答案
  • 一个答案属于一个问题
  • 一个问题有一个“question_type”列,我用它来对其进行排序

首先,范围方式...

有问题.rb:

在 questions_controller.rb 中:

然后在视图中,我循环遍历这些实例变量(现在是最多包含 10 个元素的数组)并显示结果。

以下是加载页面所需的时间(五次不同):

在 535 毫秒内完成 200 次 OK(查看次数:189.6 毫秒 | ActiveRecord:46.2 毫秒)

在 573 毫秒内完成 200 次 OK(查看次数:186.0 毫秒 | ActiveRecord:46.3 毫秒)

在 577 毫秒内完成 200 次 OK(查看次数:189.0 毫秒 | ActiveRecord:45.6 毫秒)

在 532 毫秒内完成 200 次 OK(查看次数:182.9 毫秒 | ActiveRecord:46.1 毫秒)

在 577 毫秒内完成 200 次 OK(查看次数:186.7 毫秒 | ActiveRecord:46.9 毫秒)

现在,凌乱的控制器方式......

以下是现在加载页面所需的时间(五次不同):

在 475 毫秒内完成 200 次 OK(查看次数:196.5 毫秒 | ActiveRecord:34.5 毫秒)

在 480 毫秒内完成 200 次 OK(查看次数:200.4 毫秒 | ActiveRecord:36.4 毫秒)

在 434 毫秒内完成 200 次 OK(查看次数:198.2 毫秒 | ActiveRecord:35.8 毫秒)

在 475 毫秒内完成 200 次 OK(查看次数:194.2 毫秒 | ActiveRecord:36.4 毫秒)

在 475 毫秒内完成 200 次 OK(查看次数:195.0 毫秒 | ActiveRecord:35.4 毫秒)

所以...

除了可读性之外,通过范围磨练查询还能获得什么?当有更多记录时,它最终会变得更快吗?

0 投票
2 回答
5792 浏览

ruby-on-rails - 模型中的虚拟列

是否可以向模型添加虚拟列(不是虚拟属性!)?

我有以下情况:AProduct(id, name)有很多ProductVariant(id, price, offer_price, product_id,...)

当我选择所有产品时,我希望从ProductVariants产品结果中的所有产品中获得最低产品价格。

我在 sql 查询 () 中计算最低价格,with_min_price并希望将此min_price值添加到Product我的@products result.

0 投票
1 回答
1338 浏览

ruby-on-rails - 建立连接似乎不支持连接

我正在尝试将我的用户帐户和会话数据移动到一个单独的数据库中,以便我们最终可以在多个应用程序之间共享它。

我在网上看到很多人说用来establish_connection告诉模型连接到不同的数据库,但我无法让它工作。

配置/数据库.yml

应用程序/模型/user.rb

应用程序/模型/person.rb

这似乎很有效:

我可以单独查询User

但是一旦我尝试使用join它就会中断:

ARel 似乎正在使用当前数据库,而不是通过反射获得正确的数据库。

我发现了差不多两年前关于这个问题的这个非常古老的错误报告,但我几乎可以肯定它是关于旧的 ARel 语法的,我真的怀疑代码示例是否会继续工作。

这甚至可能吗?

更新:通过这样做取得了一点进展:

但这真的很乏味,我想加入的表之一是多态的。

我尝试添加:

但这又回来了

在我看来,Rails3 实际上并不支持多个模式。我错了吗?

0 投票
1 回答
539 浏览

ruby-on-rails - 有没有一种特别优雅的方式来使用 Rails 3 / Arel 进行计数查询?

这是一个 Rails2 查询:

查询很难看,但生成的 SQL 是理想的。

在 Rails 3 / Arel 中有更优雅的方法吗?

编辑

这更漂亮,但仍然没有 Arel 魔法:

0 投票
4 回答
94060 浏览

ruby-on-rails - 如何在 Arel 和 Rails 中进行 LIKE 查询?

我想做类似的事情:

我在 Arel 的尝试:

然而,这变成:

Arel 正确包装了查询字符串“Smith”,但因为这是一个 LIKE 语句,所以它不起作用。

如何在 Arel 中进行 LIKE 查询?

PS Bonus--我实际上是在尝试扫描表上的两个字段,包括名称和描述,以查看查询是否匹配。那将如何运作?

0 投票
1 回答
83 浏览

ruby-on-rails - 你如何做一个逻辑或使用两个 ActiveRelation 结果返回另一个关系

鉴于我有以下代码

如果我想将产品制造并分发到德国,我可以执行以下操作

在上述情况下,如果我愿意,我可以在将其分配给产品之前链接更多的关系方法。

如果我想访问所有涉及德国的产品,我可以执行以下操作

在这里,我无法在将更多关系方法分配给产品之前将其链接起来,因为 OR 的结果Array不是ActiveRecord::Relation。

我的问题是我如何 OR for_country 与 from_country 并得到ActiveRecord::Relation一个结果?

理想情况下,如下所示Product.for_country(country).or(Product.from_country(country))

0 投票
4 回答
721 浏览

sql - Rails 3:是否有`AR#or_where`?

AR#or_whereRails 3 中是否有一个

?

0 投票
5 回答
14091 浏览

sql - 子查询可以为 NULL 时的 SQL“IN 子查询”

我有一个查询需要返回子查询中不匹配的结果。子查询可以返回一个空结果,所以如果子查询返回一个空集,我需要设置一个默认值(比如 0),以防止IN (NULL)它总是返回另一个 NULL。

例如

subquery_that_selects_ids如果子查询没有找到匹配的结果,则可以返回一组整数,即 (1,2,5,6) 或空集。

COALESCE在这里不起作用,因为子查询可能会返回多个结果。

解决方案需要在 SQLite 或 postgresql 中运行。如何防止子查询返回空集?


每个人都告诉我查询应该按书面方式工作。你们都是对的。该查询是由 Rails3 的 AREL 构建的,当我准备在这里发布完整的查询时,我注意到 AREL 在使用数组条件时将 NULL 放入空集。

IE 我在 rails 中的查询看起来像:

Object.where(other_conditions)评估为[]?替换为NULL

所以我重新编写查询看起来像:

问题解决了。

我赞扬@Michael Buen,但也赞成任何告诉我查询会按书面形式工作的人,因为它们是正确的。特别感谢@OMG Ponies 和@Ted Elliott!