【问题标题】:How I can invoke rails callback from separated script with ActiveRecord?如何使用 ActiveRecord 从单独的脚本调用 rails 回调?
【发布时间】:2017-11-27 10:50:35
【问题描述】:

我有一个简单的 Rails 应用,里面有活动记录模型和回调。

class Place < ApplicationRecord
  after_update :update_markers

  private

  def update_markers
    …
  end
end

我也有单独的脚本,可以通过“active_record”访问我的 bd

 require 'active_record'

 ActiveRecord::Base.establish_connection({
   adapter: 'postgresql',
   encoding: 'unicode',
   username: 'postgres',
   host: 'localhost',
   database: 'myapp_development'
 })

 class Place < ActiveRecord::Base
   self.table_name = “places”
 end

 Place.last.update(name: ‘My name’)

当我尝试更新此脚本中的值时,回调不会调用。如何调用它?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql activerecord callback


    【解决方案1】:

    确保在脚本require [root]/app/models/place.rb 中加载您的模型。现在看起来你没有扩展你的模型,而只是定义它,所以那里不会有回调。 Rails 自动加载模型,但您的脚本对此一无所知。

    如果您的脚本与 Rails 应用程序完全分离,那么您别无选择,只能复制您的模型回调。在您的脚本中:

    class Place < ActiveRecord::Base
      self.table_name = “places”
      after_update :update_markers
    
      private
    
      def update_markers
       …
      end
    end
    

    【讨论】:

    • 我无法在这个脚本中加载我的模型,因为它有更多的依赖关系,我不想加载所有内容。当某些事件发生(来自另一个服务的事件)时,我运行我的脚本。此脚本必须位于我的应用程序之外的某个位置。
    • update_markers 是否有任何第三方依赖项?
    • 更新了我的答案
    • 是的,我想调用ActionCable.server.broadcast
    • 当您在代码中更改对象时,此类回调由 Rails 本身触发。它不能也没有实现来跟踪数据库服务器内部的更改。我的回答对你有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多