我想使用 Sqlite3 的 create_function 添加一个用户定义的函数,数据库触发器将使用该函数。
有没有办法挂钩到 ActiveRecord 连接建立以在每次连接到数据库时运行一些代码,在那里可以创建函数并使其可用于触发器?这对于在连接上设置 pragma 也很有用。
我想使用 Sqlite3 的 create_function 添加一个用户定义的函数,数据库触发器将使用该函数。
有没有办法挂钩到 ActiveRecord 连接建立以在每次连接到数据库时运行一些代码,在那里可以创建函数并使其可用于触发器?这对于在连接上设置 pragma 也很有用。
这是我自己发现的。在 app/config/initializers 中使用初始化程序我这样做:
ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
alias_method :orig_initialize, :initialize
def initialize(connection, logger = nil, pool = nil)
orig_initialize(connection, logger, pool)
if connection.is_a? SQLite3::Database
# 'reverse' is just an example :^)
connection.create_function('reverse', 1) { |func, value| func.result = if value then value.to_s.reverse end }
end
end
end
我不确定这个类是否会被重新加载,但如果我得到它,我会越过那座桥。