Перебрать хеш и найти записи для удаления в Ruby
Я самообучающийся рубин, смотрю несколько видео и читаю блоги. В настоящее время я нахожусь в ситуации, когда мне нужно проанализировать перечисленные ниже параметры, которые я получаю из внешней системы CRM, в RUBY, найти соответствующие записи в базе данных и удалить их. Это хорошо работает, когда я получаю одну запись через код ниже:
temp_id = params[:salesforce_id]
Table.find_or_initialize_by(:id => temp_id).destroy
но я изо всех сил, когда мне нужно проанализировать несколько записей, как показано ниже, я получаю эту ошибку "ArgumentError (неправильное количество аргументов (задано 0, ожидается 1)):" Возможно, мне придется пройти через это, но любой пример кода действительно поможет,
{"_json"=>[{"id"=>"1"}, {"id"=>"2"}, {"id"=>"3"}], "delete_record"=>{"_json"=>[{"id"=>"1"}, {"id"=>"2"}, {"id"=>"3"}]}}
Спасибо
2 ответа
Структура у вас есть Hash
(A) имея ключ "_json"
и ключ "delete_record"
соответствует Hash
(B) значение. это Hash
содержит пару ключ / значение с "_json"
в качестве ключа и Array
в качестве значения. это Array
содержит (несколько) Hash
(С) объекты.
То, что вы хотите здесь, это:
- Получить значение внутри Hash (A) для ключа
"delete_record"
, который является хэш (B) - Получить значение внутри Hash (B) для ключа
"_json"
, который является массивом объектов Hash (C) - Для каждого хеша (C) внутри массива, получите значение для ключа
"id"
,
Вы можете сделать следующее:
data = {
"_json"=>
[{"id"=>"1"}, {"id"=>"2"}, {"id"=>"3"}],
"delete_record"=>
{"_json"=>[{"id"=>"1"}, {"id"=>"2"}, {"id"=>"3"}]}
}
# step 1
data_for_delete_record_key = data['delete_record']
# step 2
array_of_hashes_with_id_key = data_for_delete_record_key['_json']
# step 3
ids_to_destroy = array_of_hashes_with_id_key.map { |hash| hash['id'] }
Затем вы можете просто использовать следующее для уничтожения соответствующих записей:
Table.where(id: ids_to_destroy).destroy_all
Попробуйте использовать:
temp_id = {"_json"=>[{"id"=>"1"}, {"id"=>"2"}, {"id"=>"3"}], "delete_record"=>{"_json"=>[{"id"=>"1"}, {"id"=>"2"}, {"id"=>"3"}]}}
temp_id["delete_record"]["_json"].pluck("id").each do |x|
Table.find_or_initialize_by(:id => x.to_i).destroy
end