Rails 型号名称与包含的 gem 冲突

Rails Model name conflict with included gem

我们一直在成功地模拟我们的电子邮件作业,直到我们真正将我们的 SendGrid Gem 包含在我们的 worker

顶部
require 'sendgrid-ruby'
include SendGrid

class Notifications::WelcomeWorker
  include Sidekiq::Worker

  def perform(email_id)

    emailAddr = Email.find(email_id)
    ...
  end
end

问题的出现似乎是因为 SendGrid 在 (Email) 中具有相同的模型

从而生成消息

undefined method `find' for SendGrid::Email:Class

我试过通过 ApplicationRecord::Email 调用电子邮件以更具体地说明情况,但无济于事。

所有 SO 和其他指南通常都会更改我们的模型名称,但我觉得必须有更好的方法。需要明确的是,我们是 运行 Rails 5,所以我想知道是否有更新来解决我根本没有发现的这个问题。

include SendGrid 罪魁祸首。

它将SendGrid模块中的所有常量添加到当前模块(可能是顶层),因此您可以使用SendGrid的classes而无需前缀,例如只是 Email.new 而不是 SendGrid::Email.new.

缺点是它还会扰乱您现有的常量。

您可以将其包含在特定模块下:

class Notifications::WelcomeWorker
  include Sidekiq::Worker
  include SendGrid

  # ...
end

然后,Email 解析为 Sendgrid::Email::Email 解析为您的顶级 Email class.

或者您可以简单地删除 include SendGrid 行并使用 SendGrid:: 前缀。