【问题标题】:ActiveRecord callback or MySql trigger?ActiveRecord 回调或 MySql 触发器?
【发布时间】:2017-01-02 08:59:55
【问题描述】:

假设我们有两个模型:

class Message < ActiveRecord::Base
  belongs_to :user
  has_many :statistics
end

class Statistic < ActiveRecord::Base
  belongs_to :user
  belongs_to :messages
end

Message 具有 :state 属性,并且必须根据 Statistic 计数(例如,delivered_at、read_at)进行更新。这意味着一旦消息被传递给组中的每个用户,状态就必须相应地更新。
Statistics 时间戳在 sidekiq 作业中使用不调用回调 (update_all) 的查询进行更新,因此我无法连接到统计信息的“after_update”回调并更新 Message.state
我尝试在统计表上更新触发器后使用 MySql 执行此操作,但没有运气,因为调用触发器的查询在连接中有目标表(消息)。
请指教。
希望我足够清楚。
谢谢。

【问题讨论】:

    标签: mysql ruby-on-rails activerecord triggers


    【解决方案1】:

    起初,MySQL 触发器不起作用似乎并不好。这是最不期望的行为,因为触发器是 MySQL 数据库的原生东西,它们应该在您更新表时工作,尽管它是通过 Rails、查询或任何其他实体进行的。您应该查看触发器的代码并对其进行调试以找出它不工作的原因。

    或者,sidekiq 作业有after_perform,当作业完成执行其工作时调用它。你可以在那里写你的代码。但这仍然不能保证您的工作是成功还是失败。所以你需要照顾它。

    【讨论】:

    • 谢谢!我认为 sidekiq 回调仅在专业版中。
    【解决方案2】:

    我发现调用触发器的查询中的 JOIN 是不必要的。删除了 JOIN,触发器按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      相关资源
      最近更新 更多