У меня та же проблема, описанная в этом вопросе. PostgreSQL: сравните jsons
, но мне нужен способ сделать это в рельсах, у меня есть столбец метаданных, который я должен запрашивать каждый раз при вставке записи.Итак, я должен сравнить между значением, которое будет вставлено, и содержимым, которое у меня есть, и этот столбец может быть пустым.
то, что я пытался использовать json::text
, но это означает, что я долженсделать запрос для каждой настройки ключей и значений json.
## for checking the empty query and if not empty, i loop through the json objects
if metadata.to_s == '{}' || metadata.to_s == ''
gears = gear_query.where("metadata::text = ?", metadata.to_s)
else
gears = gear_query.each.collect{ |g| g if g.eq_metadata?(metadata) }.compact
end
## looping through all the shapes of the json objects
## and calling diff function to recognize if the objects are different or not
def eq_metadata?(metadata)
src_mtd = self.metadata.sort_by { |k, v| k }.to_h
new_mtd = metadata.sort_by { |k, v| k }.to_h
src_keys = src_mtd.keys.each.map(&:to_sym)
new_keys = new_mtd.keys.each.map(&:to_sym)
((src_keys == new_keys) && (src_mtd.values == new_mtd.values))
end
Я думаю, что есть лучший способ, или что я что-то упустил с моим кодом.Мой вопрос не о необработанных SQL-запросах, а о способе сравнения содержимого объектов json, хранящихся в базе данных, с объектом json в руках.я выбрал способ получить все объекты json из базы данных, а затем сравнить их с объектом json в руке ... есть ли другой способ ??