区分gem模块和AR模型

时间:2018-08-13 11:32:02

标签: ruby-on-rails ruby activerecord

我正在使用Etsy gem,它是一个Listing模块。 我的应用程序中也有一个对应的Listing模型。

我试图设置一个sidekiq工作者来处理gem,调用一些方法并更新相应的Listing行,但是因为我有include Etsy以便可以使用gem ,Rails感到困惑,并认为我是指模块而不是模型。

代码如下:

class ListingWorker
  include Sidekiq::Worker
  include Etsy

  def perform(seller, shop)
    access_token = {access_token: seller.oauth_token,
              access_secret: seller.request_secret}
    myself = Etsy.myself(access_token[:access_token], access_token[:access_secret])
    limit = 100
    offset = 0
    total_results = myself.shop.active_listings_count
until offset > total_results
  listings = Etsy::Request.get("/shops/#{shop.shop_id}/listings/active",
                               access_token.merge(limit: limit.to_s,
                                            offset: offset.to_s,
                                            include_private: 'true',
                                            includes: 'Images:1:0'))
                          .to_hash
  offset += limit

  listings['results'].each do |l|
    listing = Listing.find_by(listing_id: l['listing_id'])

结束 结束

这是我得到的错误:

undefined method `find_by' for Etsy::Listing:Class

如何区分模块和模型,并使Rails理解我的意思是数据库表?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的问题的简短答案就是不要include Esty

class ListingWorker
  include Sidekiq::Worker

  def perform(seller, shop)
    # ...
  end
end

include的目的是将模块定义的方法添加到您的类中。

例如,如果我定义了一个模块:

module Tom
  def hello
    puts "Hello!"
  end
end

您想直接在您的hello类中调用ListingWorker然后,您需要include Tom

另一方面,假设我只是在模块内定义“命名空间”方法,例如:

module Maayan
  def self.example
    puts "Example"
  end
end

然后,应通过引用模块Maayan.example来调用它。

您可以从任何地方进行此操作(前提是已加载包含此代码的文件);您不需要include

这就是您在这里所做的-为了运行诸如Etsy.myselfEtsy::Request.get之类的代码,您不需要include该模块。您是直接在模块上调用方法,而不是将模块的方法混入自己的类中。


但是,如果您没有发现自己处于这样的情况下,即您的嵌套类与顶级定义有冲突,请注意,ruby允许您通过在前面添加前缀来显式访问全局范围的类::到班级名称。

换句话说,您可以使用::Listing显式引用您自己的类。