如何让Ruby on Rails监视与其他应用程序共享的postgresql表中插入的记录

wpx232ag  于 2023-03-17  发布在  Ruby
关注(0)|答案(1)|浏览(93)

我有一个应用程序使用了Rails6.1和postgres数据库。第二个应用程序可以访问同一个数据库,并将记录插入到其中一个表中。我希望Rails应用程序知道何时插入新记录,这样我就可以运行一些Ruby代码作为响应。我试图找到一个健壮的一个可测试的解决方案。我能想到的最好的主意是在那个表上添加一个布尔列。然后让Rails应用程序定期查询表中任何新列设置为false的记录,我运行这些记录的代码,然后将新列翻转为true。这意味着使用类似于Whenever gem的东西。我想不出任何更好的主意。我研究了postgres使用listen和notify的pubsub类型的东西,感觉它不会像那样健壮和可测试。遗憾的是,在Rails应用程序中创建API端点不是一个选项。

tjjdgumg

tjjdgumg1#

如果API端点确实不是一个选项,那么如果非Rails应用插入到不同的表中,我们仍然可以使用一些相同的技术。
我们将表命名为products,它有一个匹配的Product模型,这是Rails应用使用的产品表,我们将其命名为AppOne。
让我们调用另一个应用程序AppTwo。它将插入到一个名为app_two_products的表中。这很好,因为另一个应用程序不必关心created_at等Rails列。并且您可以在AppOne中更改products表和Product模型,而不会破坏AppTwo的插入代码。我强烈建议不要让两个应用程序访问同一个表。如果AppTwo决定批量导入100万条记录,这可能会破坏AppOne中的表单。如果AppTwo对AppOne的表具有完全访问权限,它甚至可能最终删除记录。我们希望控制接收这些内容的时间和方式。
现在,我们在AppOne中编写一些代码,将app_two_products中的数据转换为products。由于products具有ActiveRecord产品型号,因此我们可以获得与之相关的所有好处(例如验证、回调)。对于这类代码,我推荐Kiba,一个ETL Gem,但是你也可以只写一个普通的Ruby脚本/对象。插入后需要运行的Ruby代码可以在ActiveRecord对象上完成,也可以通过import脚本完成。您可以使用Sidekiq和Sidekiq Cron定期运行这个导入脚本,或者按照建议随时运行。
我在这里假设,数据是否“延迟”进入你的应用程序并不重要,任何来自AppTwo的插入都不需要立即反映出来。IME这是经常发生的情况。如果有时需要“匆忙”,你可以添加一个“立即导入”按钮来触发这项工作。
同样,我强烈反对这两个应用程序在同一个表上工作。如果AppTwo * 有 * 插入到AppOne正在使用的表中,我会更改AppOne正在使用的表,以避免它们使用同一个表。

相关问题