我正在使用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理解我的意思是数据库表?
谢谢!
答案 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.myself
或Etsy::Request.get
之类的代码,您不需要include
该模块。您是直接在模块上调用方法,而不是将模块的方法混入自己的类中。
但是,如果您没有发现自己处于这样的情况下,即您的嵌套类与顶级定义有冲突,请注意,ruby允许您通过在前面添加前缀来显式访问全局范围的类::
到班级名称。
换句话说,您可以使用::Listing
显式引用您自己的类。