Если вам гарантирована, что длина массивов одинакова, а порядок не меняется, вы можете сделать что-то вроде:
data = {
first_name: ["John", "Tom", "Michael"],
last_name: ["Smith", "Watts","Pit"],
email: ["John.smith@gmail.com", "tom.watts@gmail.com", "mike.pit@gmail.com"]
}
0.upto(data[:first_name].length-1) do |i|
record = {
first_name: data[:first_name][i],
last_name: data[:last_name][i],
email: data[:email][i]
}
User.create!(record)
end
Вы также можете сойти с ума с помощью .zip и.each_slice, хотя я думаю, что вышесказанное является более простым и понятным.
maxlen = data[:first_name].length
first_name_fields = Array.new(maxlen, 'first_name')
last_name_fields = Array.new(maxlen, 'last_name')
email_fields = Array.new(maxlen, 'email')
records = first_name_fields.zip(data[:first_name], last_name_fields, data[:last_name], email_fields, data[:email])
records.map!{|x| x.each_slice(2).to_a.to_h}
records.each{|record| User.create!(record)}