【问题标题】:How to find the length or existence of an array/activerecord relation within an activerecord query如何在活动记录查询中查找数组/活动记录关系的长度或存在
【发布时间】:2021-10-24 14:46:48
【问题描述】:

我有两个模型:

class Listing
  has_many :shipping_selections
end

&

class ShippingSelection
  belongs_to :listing

  enum status: { incomplete: 0, complete: 1 }
end

我需要编写一个查询,该查询将返回没有任何附加 shipping_selections 且状态为“完成”的列表。

我尝试过这样的事情:

Listing.includes(:shipping_selections).where('shipping_selections.complete.any? != ?, true)

但是我收到以下错误: “ActiveRecord::PreparedStatementInvalid:绑定变量的数量错误(1 对 2)在:shipping_selections.complete.any? = ?”

好像不能在SQL语句中使用这样的ruby方法。

然后我尝试改用 SQL 语句,例如:

Listing.where('cardinality(shipping_selections.complete) != ?, 0')

然而这似乎也不起作用。

感谢您的帮助!

【问题讨论】:

  • 为了澄清我想要退回的东西,我想要所有列表,除了那些具有“完成”状态的 shipping_selections 的列表。在返回的列表中应该包括根本没有 shipping_selections 的列表。

标签: ruby-on-rails ruby activerecord ruby-on-rails-5


【解决方案1】:

你得到错误的原因是你尝试用 SQL 查询。所以发生的情况是它试图用纯 SQL 读取您的代码,而 SQL 不包含任何内置的 Rails 函数。如果要在 SQL 中查询,则需要检查 status == 0 而不是 .complete,它在 SQL 上下文中不存在。这是内置在活动记录轨道功能中的,它允许我们像这样编写它。你正在寻找的是这样的:Listing.where(shipping_selections: shipping_selections.inclomplete)

【讨论】:

  • 你的推理是正确的,但我不确定提供的解决方案是否是我需要的。
  • 啊,kk现在看到你的说明了。试试这个:Listing.where.not(ShippingSelection: ShippingSelection.complete)
  • 我运行时在控制台中得到的只是:#<Listing::ActiveRecord_Relation:0x2abfb1f44cdc> 这表明查询中有错误
  • 嗯,有趣的是它如何处理 where 而不是 where.not 在枚举的情况下,听起来像一个错误。不会费心修复它,因为您似乎从上面的评论中得到了答案。干杯:)
【解决方案2】:

问题是您想使用 ruby​​ 代码作为 SQL 语句。因此,当您将枚举用于 status 字段时,您可以使用这些:

  • 要获取包含已完成运输选择的列表数组:
    Listing.joins(:shipping_selections).merge(ShippingSelection.complete)
  • 要获取包含不完整运输选择的列表数组:
    Listing.joins(:shipping_selections).merge(ShippingSelection.incomplete)

【讨论】:

  • 谢谢。尽管它并没有完全给出我想要的答案,但我使用了您建议的第一个查询并将其从原始列表中减去,以留下我需要的内容。 ?
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多