11168: Always deep-sort before comparing in where_serialized.
[arvados.git] / services / api / app / models / arvados_model.rb
index b2e1bea3ab2a7ec42352fcf942deab85c62c295b..0419dadafba891995156b7f5c286f1955a9fbb8e 100644 (file)
@@ -1,5 +1,6 @@
 require 'has_uuid'
 require 'record_filters'
+require 'serializers'
 
 class ArvadosModel < ActiveRecord::Base
   self.abstract_class = true
@@ -454,6 +455,20 @@ class ArvadosModel < ActiveRecord::Base
     end
   end
 
+  def self.where_serialized(colname, value)
+    sorted = deep_sort_hash(value)
+    where("#{colname.to_s} IN (?)", [sorted.to_yaml, SafeJSON.dump(sorted)])
+  end
+
+  Serializer = {
+    Hash => HashSerializer,
+    Array => ArraySerializer,
+  }
+
+  def self.serialize(colname, type)
+    super(colname, Serializer[type])
+  end
+
   def ensure_serialized_attribute_type
     # Specifying a type in the "serialize" declaration causes rails to
     # raise an exception if a different data type is retrieved from