就像问题所说,我正在尝试使用以下函数导入 CSV:
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"
end
Run Code Online (Sandbox Code Playgroud)
如您所知,这是一个简单的函数。
所有具有正确数据的列均已正确导入,但User Class会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
end
Run Code Online (Sandbox Code Playgroud)
这会导致数据库中的密码列被新的哈希值作为密码再次重写,从而阻止登录,因为列值已更改。数据库中的密码列不包含与 CSV 文件中相同的信息。
通常我实施了skip_callback绕过password validation但似乎不起作用。
我真的很感激任何形式的帮助,因为我已经尝试解决这个问题几天了,但似乎不明白为什么。
我正在使用 Ruby 与数据库通信,并且有一个统计页面显示设备的统计信息。不幸的是,当执行选择查询以显示页面时,我收到以下错误:
错误 -- : StatementInvalid: Java::JavaSql::SQLSyntaxErrorException: ORA-00936: 缺少表达式
SELECT
COUNT(*) AS count_all,
date(request_time) AS date_request_time,
"REQUESTS"."DEVICE_ID" AS requests_device_id
FROM
"REQUESTS"
WHERE
(
customer_id = 1
AND request_method != 'OPTIONS'
AND request_time BETWEEN '2021-10-27 00:00:00' AND '2021-11-03 23:59:59.000999'
)
AND
(
device_id IS NOT NULL
AND request_time BETWEEN '2021-10-27 00:00:00' AND '2021-11-03 23:59:59.000999'
)
GROUP BY
date(request_time),
"REQUESTS"."DEVICE_ID"
Run Code Online (Sandbox Code Playgroud)
缺少什么表情?我似乎错过了什么。