gpt4 book ai didi

ruby-on-rails - 如何在 Rails 中的数据库连接上执行查询?

转载 作者:行者123 更新时间:2023-11-29 11:25:28 25 4
gpt4 key购买 nike

我有一些初始化函数,用于在 PostgreSQL 的数据库服务器端(即非 Rails)设置审计日志记录。在将数据插入或更新任何审计表之前,至少必须发出(设置当前用户),否则整个查询将失败。

每次在代码中运行任何保存操作之前,我都可以轻松地调用它们,但是 DRY 让我觉得我应该在尽可能少的地方重复代码,特别是因为这与数据库不可知论的理想有很大的不同。目前,我正在尝试在初始化程序中覆盖 ActiveRecord::Base.establish_connection 以进行设置,以便在我自动连接后立即运行查询,但它的行为并不像我预期的那样。这是初始化程序中的代码:

class ActiveRecord::Base  # extend the class methods, not the instance methods  class << self    alias :old_establish_connection :establish_connection # hide the default    def establish_connection(*args)      ret = old_establish_connection(*args) # call the default      # set up necessary session variables for audit logging      # call these after calling default, to make sure conn is established 1st      db = self.class.connection      db.execute("SELECT SV.set('current_user', 'test@localhost')")      db.execute("SELECT SV.set('audit_notes', NULL)") # end "empty variable" err      ret # return the default's original value    end  endendputs "Loaded custom establish_connection into ActiveRecord::Base"
sycobuny:~/rails$ ruby script/server => Booting WEBrick=> Rails 2.3.5 application starting on http://0.0.0.0:3000Loaded custom establish_connection into ActiveRecord::Base

这不会给我任何错误,不幸的是我无法检查该方法在内部的样子(我使用的是 ActiveRecord::Base.method(:establish_connection),但显然每次都会创建一个新的 Method 对象它被称为,这看起来毫无值(value),因为我无法检查 object_id 以获取任何有值(value)的信息,而且我也无法逆转编译)。

但是,代码似乎永远不会被调用,因为任何对数据库对象运行保存或更新的尝试都会像我之前预测的那样失败。如果这不是在连接到数据库时立即执行代码的正确方法,那么什么才是?

最佳答案

Rails 使用连接池,所以最好的办法是为 ActiveRecord::ConnectionAdapters::ConnectionPool#new_connection 使用 alias_method_chain

module ActiveRecord
Module ConnectionAdapters
class ConnectionPool
alias_method_chain :new_connection, :my_stuff
private
def new_connection_with_my_stuff
c = new_connection_without_my_stuff
# Do your stuff with
# c.exec(<your sql command>)
c
end
end
end
end

关于ruby-on-rails - 如何在 Rails 中的数据库连接上执行查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2519413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com