Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Rails/ActiveRecord中命名SQL查询_Sql_Ruby On Rails_Rails Activerecord_Apm - Fatal编程技术网

在Rails/ActiveRecord中命名SQL查询

在Rails/ActiveRecord中命名SQL查询,sql,ruby-on-rails,rails-activerecord,apm,Sql,Ruby On Rails,Rails Activerecord,Apm,将Rails与ActiveRecord和PostgreSQL一起使用时,执行简单查询会为它们添加一个名称,例如调用 第条.全部 =>文章加载2.6ms从文章中选择文章。* 命名查询项目加载。但是,当执行稍微复杂一些的查询时,不会生成任何名称,例如 Article.group:Article\u group\u id.count =>1.2ms选择COUNT*作为COUNT\u all,articles.article\u group\u id作为articles\u article\u grou

将Rails与ActiveRecord和PostgreSQL一起使用时,执行简单查询会为它们添加一个名称,例如调用

第条.全部 =>文章加载2.6ms从文章中选择文章。* 命名查询项目加载。但是,当执行稍微复杂一些的查询时,不会生成任何名称,例如

Article.group:Article\u group\u id.count =>1.2ms选择COUNT*作为COUNT\u all,articles.article\u group\u id作为articles\u article\u group\u id,从articles group BY articles.article\u group\u id中选择 如果使用execute方法执行自定义查询,我可以添加名称:

ActiveRecord::Base.connection.executeSELECT*来自文章,我的自定义查询名称 =>我的自定义查询名称2.5ms从文章中选择* 但有没有办法向使用ActiveRecord方法生成的查询中添加自定义名称


如果您想知道原因:该名称对于所有类型的监视都很有用,例如,在AppSignal中查看慢速查询时。

因为您只想自定义查询名称以进行监视,所以我认为您只需要在ActiveRecord::ConnectionAdapterslog方法中更改查询名称,该方法记录要执行的sql查询,包括查询名称

以下是我的解决方案:

lib/active_record/base.rb 请注意,必须是base.rb 否则,您需要添加初始值设定项来扩展Rails核心 模块活动记录 模块连接适配器 类抽象适配器 属性访问器:日志标记 私有的 别名旧日志 def logsql,name=SQL,binds=[],type_casted_binds=[],statement_name=nil 如果名称!='模式' name=@log\u标签 @log_tag=nil重置 终止 old_logsql,name,binds,type_casted_binds,statement_name do 产量 终止 终止 终止 终止 模块查询方法 def log_tagtag_name类方法 spawn.log\u tagtag\u名称 自己 终止 终止 模块查询 委派:日志标记,收件人::全部 终止 阶级关系 def log_tagtag_name实例方法 conn=klass.连接 conn.log\u tag=标签名称 自己 终止 终止 终止 演示

Task.log_tagDEMO.group:status.count 演示0.7ms从tasks GROUP BY tasks.status中选择COUNT*作为COUNT\u all,tasks.status作为tasks\u status Task.wherestatus:6.log_tagSIX.first20 六个0.8毫秒选择任务。*从任务中,tasks.status=?按任务排序。id ASC限制? Task.where状态:6.first20 0.8ms选择tasks.*从tasks.status=?按任务排序。id ASC限制? 注

如果您想为特定查询修复查询名称,可以使用一个哈希值,其中key是特定sql字符串的整数或整个sql的哈希值,例如Rails核心缓存查询的方式:query\u signature=ActiveSupport::Digest.hexdigestto\u sql,该值是您想要的查询名称

摆在面前 ActiveRecord::ConnectionAdapters::LogTags[Product.where…to_sql]=演示 抽象适配器 LogTags=Hash.new def logsql,名称。。。 name=LogTags[sql] ... 终止
有趣的我甚至不知道我们能说出他们的名字。