Notes: * Your code looks pretty good, but I personally wouldn't have written it as a mixable module, this code seemps completely independent from `ActiveRecord`. I'd write a `SpreadSheetReader` class and just use it from wherever you want (this way the code is more modular). * Where is `import_from` called from? it seems some code is missing. * This `vat_in` conditional seems too verbose. Which are the possible values of `row[:client]`? I'd write something like: company = company_from_somewhere_i_dont_know columns = [:name, :client, <other columns>...] SpreadSheetReader.rows(:columns => columns).each do |row| invoice = company.invoices.find_or_initialize_by_name(row[:name].to_s) vat_in = row[:client].is_a?(String) ? row[:client] : row[:client].to_i.to_s client = company.clients.find_by_vat_in!(vat_in) invoice.update_attributes!({ :pay_date => row[:pay_date], :full_amount => row[:full_amount].to_i, :paid_amount => row[:paid_amount].to_i, }) invoice end