扩展ActiveSupport :: Notifications.subscribe,instantiation.active_record钩子

时间:2018-12-03 22:30:55

标签: ruby activerecord notifications instantiation activesupport

我正在探索 private readonly DataContext _context = new DataContext(); public int Count() { return _context.Isletme_Rehberi.Count(); } public void Delete(int id) { var Isletme_Rehberi = GetById(id); if (Isletme_Rehberi != null) _context.Isletme_Rehberi.Remove(Isletme_Rehberi); } ERROR OCCURS IN THIS LINE : public Isletme_Rehberi Get(Expression<Func<Isletme_Rehberi, bool>> expression) { return _context.Isletme_Rehberi.FirstOrDefault(expression); } public IEnumerable<Isletme_Rehberi> GetAll() { return _context.Isletme_Rehberi.Select(x => x); } public Isletme_Rehberi GetById(int id) { return _context.Isletme_Rehberi.FirstOrDefault(x => x.id == id); } public IQueryable<Isletme_Rehberi> GetMany(Expression<Func<Isletme_Rehberi, bool>> expression) { return _context.Isletme_Rehberi.Where(expression); } public void Insert(Isletme_Rehberi obj) { _context.Isletme_Rehberi.Add(obj); } public void Save() { _context.SaveChanges(); } public void Update(Isletme_Rehberi obj) { _context.Isletme_Rehberi.AddOrUpdate(obj); } ,并且除了ActiveSupport::Notifications [1]之外,我还想了解有关'instantiation.active_record'的更多信息。例如,

:record_count

可以这样做吗?如果可以,怎么办?

更新: 感谢下面的汤姆和帕维尔。挑战的一部分是,我正在构建一个第三方的gem,它将分析主机应用程序的所有SQL返回,而无需修改其代码。基本上,将其插入Gemfile并捆绑,然后离开。

我正在考虑使用extending ActiveRecord::Baseusing the method append_info_to_payload,但到目前为止,它们都无法正常工作。

作为一个例子,我想覆盖ActiveRecord :: Query.find_by_sql()方法的有效负载,看起来像这样:

:class_name

在测试中,并手动编辑本地ActiveRecord gem,这将通过ActiveSupport :: Notifications发布/订阅提供完整的result_set。

回答:因此,答案是使用ActiveSupport::Notifications.subscribe /instantiation.active_record/ do |*args| args.status #Database or ActiveRecord return status args.result #The actual result set returned args.etc .. #Any other info I can collect on the event # Additional code ... end 方法,并覆盖ActiveRecord :: Querying:

中的find_by_sql方法
payload = {
  record_count: result_set.length,
  class_name: name,
  result_set: result_set
}

我将此添加到了我的宝石的class_eval文件中。

最终:我在ActiveRecord上创建了两个拉取请求,以使result_set传递到有效负载中,以用于ActiveSupport :: Notifications:querying.rbjoin_dependency.rb

2 个答案:

答案 0 :(得分:1)

  

可以这样做吗?如果可以,怎么办?

我不这样认为。

看看thisthis-在两种情况下,payload都是仅具有record_countclass_name选项的哈希。除了指南中所述的其他选项。

答案 1 :(得分:1)

您可以使用::instrument创建一个custom hook。然后,您可以定义具有statusresult_set等的有效负载,并在块中定义其行为。

您可以在::instrument::subscribe here上找到更强大的文档。

编辑:我正在进一步研究,发现this stack overflow question。您似乎正在寻找方法append_info_to_payload。它已移至{5}的private method上。

最后一次编辑:如果您感觉很勇敢,则使用herehere通知,如果您想直接插入额外的有效载荷。