【问题标题】:How do I query for models with empty serialized fields?如何查询具有空序列化字段的模型?
【发布时间】:2014-10-23 19:39:11
【问题描述】:

当我有这样的模型时,

class Order < ActiveRecord::Base
    serialize :shipping_lines

    ...
end

如何找到shipping_lines 为空的所有记录?如果我这样做,

Order.select(order.shipping_lines).limit(5)

我明白了,

=> [#<Order id: nil, shipping_lines: [#<ShippingLine:0x007f8c5d10ced0>]>,
 #<Order id: nil, shipping_lines: [#<ShippingLine:0x007f8c6ef84718>]>,
 #<Order id: nil, shipping_lines: []>,
 #<Order id: nil, shipping_lines: []>,
 #<Order id: nil, shipping_lines: []>

但随后查询Order.where(shipping_lines: []) 产生[] 并在同一查询上调用to_sql 产生=&gt; "SELECT \"orders\".* FROM \"orders\" WHERE 1=0"

我应该如何只选择具有默认值或空数组的订单作为他们的运输线?

【问题讨论】:

  • 当然我也试过where(shipping_lines: nil),但是这个总是空的。

标签: ruby-on-rails-4 rails-activerecord arel


【解决方案1】:

我在项目中处理类似问题时发现的唯一方法是将空数组直接转换为 YAML,如下所示:

Order.where(shipping_lines: [].to_yaml)

看起来像一个肮脏的黑客,但至少它解决了问题。

【讨论】:

  • 感谢@raeno,这让我发疯了。
  • 对于空的序列化哈希,我必须使用类似:Order.where.not("shipping_lines = ?", {}.to_yaml)
猜你喜欢
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2017-10-26
相关资源
最近更新 更多