[英]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.