Como dice la pregunta, estoy tratando de importar un CSV con la siguiente función:
def import_users path = Rails.root.join('somePath') CSV.foreach(path, headers: true) do |row| usr = User.new(row.to_hash) usr.skip_callbacks = true usr.save end puts "inserts on table users complete" endComo puedes ver, es una función simple.
Todas las columnas con los datos correctos se importan correctamente pero en la User Class se activa la password= function (setter) :
class User < ApplicationRecord attr_accessor :skip_callbacks validates :password, presence: true, unless: :skip_callbacks def password= password self[:password] = hash_password password end private def hash_password password Digest::MD5.hexdigest "#{Digest::MD5.hexdigest password}#{salt}" end endEsto hace que la columna de contraseña en la base de datos se vuelva a escribir con nuevos hashes como contraseñas , lo que impide el inicio de sesión porque los valores de la columna han cambiado. La columna de contraseña en la base de datos no contiene la misma información que en el archivo CSV.
Normalmente implementé un skip_callback para evitar password validation , pero parece que no funciona.
Realmente agradecería cualquier tipo de ayuda ya que he estado tratando de resolver esto durante un par de días y parece que no puedo entender por qué.
Parece que desea agregar contraseñas a la base de datos tal cual sin hash, y las validaciones no tienen nada que ver con eso porque no cambiarán el comportamiento de la función password= . Puede parchearlo con otra variable de instancia como:
class User < ApplicationRecord attr_accessor :skip_callbacks attr_accessor :skip_password_hashing validates :password, presence: true, unless: :skip_callbacks def password= password self[:password] = skip_password_hashing ? password : hash_password(password) end private def hash_password password Digest::MD5.hexdigest "#{Digest::MD5.hexdigest password}#{salt}" end endy luego parchear la importación como:
def import_users path = Rails.root.join('somePath') CSV.foreach(path, headers: true) do |row| usr = User.new(row.to_hash) usr.skip_password_hashing = true usr.save end puts "inserts on table users complete" endNo estoy seguro de si es una buena idea tener esta posibilidad en la aplicación implementada, pero debería funcionar.