Ruby on rails Rails模型名称与包含的gem冲突

Ruby on rails Rails模型名称与包含的gem冲突,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我们一直在成功地模拟我们的电子邮件工作,直到我们真正将SendGrid Gem放在工作人员的顶部 require 'sendgrid-ruby' include SendGrid class Notifications::WelcomeWorker include Sidekiq::Worker def perform(email_id) emailAddr = Email.find(email_id) ... end end 出现问题的原因似乎是SendGr

我们一直在成功地模拟我们的电子邮件工作,直到我们真正将SendGrid Gem放在工作人员的顶部

require 'sendgrid-ruby'
include SendGrid

class Notifications::WelcomeWorker
  include Sidekiq::Worker

  def perform(email_id)

    emailAddr = Email.find(email_id)
    ...
  end
end
出现问题的原因似乎是SendGrid在(电子邮件)中具有相同的模型

从而生成消息

undefined method `find' for SendGrid::Email:Class
我尝试过通过ApplicationRecord::Email调用电子邮件,以更具体地描述上下文,但没有效果


所有的SO和其他指南通常都会更改我们的型号名称,但我觉得一定有更好的方法。为了明确起见,我们正在运行Rails 5,所以我想知道它是否有一个更新来解决这个问题,而我只是没有发现。

包括SendGrid
它就是罪魁祸首

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

缺点是它也会弄乱现有的常量

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

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

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


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

您真的必须
包含SendGrid
?这似乎很有侵略性。嗯,我想我们可以选择建立自己的图书馆,而不是使用他们的。从开发的角度来看,利用他们的创业板更快,这取决于他们的选择,让我们的模型名称不同。我确实需要向SendGrid gem维护人员提交一个单独的问题。这不是我的意思:-)换句话说:如果删除
include SendGrid
行会发生什么?叮叮叮当。作为答案提交,以便我可以接受。您为我节省了无数个小时的工作。为了让其他人明白,我们选择删除include SendGRid并使用SendGRid前缀,因为这在人们查看代码时会更加明确。