У меня есть массив хэшей (# 1), который выглядит следующим образом:Рубин массив хэшей значений в строку
data = [{"username"=>"Luck", "mail"=>"[email protected]", "active"=>0}]
, что я пытаюсь сравнить со следующими массив хэшей (# 2):
test = [{"username"=>"Luck", "mail"=>"[email protected]", "active"=>"0"}]
где # 1 я получил из базы данных по mysql2 (что на самом деле находится в базе данных) и # 2 от моего огурца сценария (что я минимально ожидать ВЗ быть там).
По определению # 2 должен быть подмножеством # 1, так что я следовать с этим кодом:
data = data.to_set
test = test.to_set
assert test.subset?(data)
Проблема заключается в массиве данных значение active
не является строкой. В случае data
это Fixnum
, а в случае test
- String
.
Мне нужно решение, которое будет работать даже для более чем одного хэша в массиве. (В качестве базы данных может вернуть более одной строки результатов) Вот почему я конвертировать наборы и использовать subset?
Из других вопросов, которые я получил:
data.each do |obj|
obj.map do |k, v|
{k => v.to_s}
end
end
Однако это не работает для меня. Есть идеи?
Предположения вы можете сделать:
- Все ключи в
data
всегда будет Strings. - Все ключи в
test
всегда будут строками. И всегда быть идентичнымdata
. - Все значения в
test
всегда будут строками.
что тип, если не строка? Можете ли вы обновить свой пример с типом данных, который он показывает. Также ваша цель - сказать данные == test? Откуда возникает подмножество? – Anthony
Исправлен вопрос, чтобы предоставить ответы, на которые вы заходите. Однако для начинающих получить данные == тест будет хорошим. –
'test' - это подматрица' data', если и только если '(test-data) .puty? => true'.Это то, что вы хотите? Обратите внимание, что если 'h' и' g' являются хэшами, 'h == g => true' тогда и только тогда, когда они имеют одинаковые ключи и значения, независимо от порядка клавиш. –