我正在创建一个新的rails APP,它可以与我的API使用相同的postgres数据库。
API和APP有一对常见的模型。
例如:
API和APP有一个Connection
模型
APP将在数据库中创建一个简单的connection
,API将完成剩下的工作(就像使用connection
处理许多事情的处理程序一样)
所以我想使用允许触发数据库插入的Hair Trigger,或者更新并将其更新为将要执行的数据库行为。
但是我想从我的一个助手那里执行一个方法。
像那样:class Connection < ActiveRecord::Base
trigger.after(:insert) do
SomeObject.method()
end
end
我无法使用after_create
,因为创建操作不是在同一台服务器上完成的(但是同一个数据库)
任何想法?
谢谢!
答案 0 :(得分:0)
Hair Trigger仅支持SQL的原因是它的目的是帮助您维护数据库触发器(https://www.postgresql.org/docs/9.6/static/sql-createtrigger.html)。
数据库触发器与应用程序分离,只能在数据库中触发SQL。 它实际上无法触发应用程序内的任何代码。
问题的解决方案是使用事件。如果你曾经使用过Javascript,那么之前你可能遇到过Event和EventListener。事件的目的是解耦您的代码。在执行操作时,应用程序的一部分发送事件,例如已将某些内容插入数据库。您的应用程序的其他任何部分,您可以订阅到这些事件并采取必要的操作。
由于您正在使用Rails,我建议您仔细查看Wisper gem(github.com/krisleech/wisper)。如果你的App和API;就像你描述的那样,生活在不同的进程(或服务器)中,你应该考虑使用后台工作程序来异步处理事件。一种常见的方法是使用Sidekiq Wisper(github.com/krisleech/wisper-sidekiq),使用Sidekiq作为后台工作人员来触发事件异步。
为了对这个主题做一个很好的介绍,这里有一个让你入门的指南(我不是作者):http://www.g9labs.com/2016/06/23/rails-pub-slash-sub-with-wisper-and-sidekiq/
可能有更简单的方法来解决您面临的问题,但您需要发布一些有关用例的更多详细信息,以便为您提供更好的指示。