簡體   English   中英

Rails通過序列化數組查找

[英]Rails look up by serialized array

我正在嘗試基於序列化的數組文本字段(Postgres,如果有關系)執行Rails查找。 所以:

class Foo < ActiveRecord::Base
  serialize :arr, Array
end

然后:

> f = Foo.create!(arr: [[1, 2], [3, 4]])
=> #<Foo id: 1, arr: [[1, 2], [3, 4]]>
> f.arr
=> [[1, 2], [3, 4]]

很好 但我似乎無法根據該字段進行查找:

> Foo.where(arr: [[1, 2], [3, 4]])
=> ActiveRecord::StatementInvalid Exception: PG::UndefinedFunction: ERROR:  operator does not exist: text = integer
   "foos"."arr" IN (1, 2, ...
                ^
   HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

似乎Rails試圖將其轉換為IN查詢。 沒關系,我們知道Rails是使用Yaml序列化的(還是我們?)。 因此,讓我們嘗試:

> Foo.where(arr: [[1, 2], [3, 4]].to_yaml)
=> #<ActiveRecord::Relation []>

仔細檢查似乎使我轉向換行符,因為此查找失敗的原因。 我可以通過一個復雜的LIKE子句找到解決這個問題的方法,但是到那時,我想我可能走錯了路。

是否存在基於序列化屬性在Rails中查找模型的標准方法? (我應該用不是Yaml的東西序列化嗎?)非常感謝!

我現在使用的解決方案(肯定對其他方法開放!)是強制Rails使用Yaml之外的其他東西進行序列化,以允許進行字符串查詢:

class Foo < ActiveRecord::Base
  serialize :arr, SerializedArray

  def self.find_by_arr
    self.where(arr: SerializedArray.dump(arr)).take
  end
end

class SerializedArray
  def self.load(arr)
    arr ? JSON.load(arr) : nil
  end

  def self.dump(arr)
    arr ? JSON.dump(arr) : nil
  end
end

這有點麻煩,我必須使用自定義find_by_arr進行查詢,但是它可以工作。

(編輯:刪除了錯誤的示例代碼。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM