我有一个模型,其中包含以下两种方法,这些方法在另一个模型中是必需的,因此我认为我尝试通过关注点共享它们而不是复制代码。
class Region < ActiveRecord::Base
def ancestors
Region.where("lft < ? AND ? < rgt", lft, rgt)
end
def parent
self.ancestors.order("lft").last
end
end
我在app / models / concerns / sets.rb中创建了一个文件,我的新模型显示为:
class Region < ActiveRecord::Base
include Sets
end
sets.rb是:
module Sets
extend ActiveSupport::Concern
def ancestors
Region.where("lft < ? AND ? < rgt", lft, rgt)
end
def parent
self.ancestors.order("lft").last
end
module ClassMethods
end
end
问题: 当方法引用模型时,如何在模型之间共享方法,例如&#34; Region.where ...&#34;
答案 0 :(得分:2)
通过引用包含模型的类(但您需要将实例方法包装在included
块中):
included do
def ancestors
self.class.where(...) # "self" refers to the including instance
end
end
或(更好的IMO)只需将方法声明为类方法,在这种情况下,您可以将类本身完全取消:
module ClassMethods
def ancestors
where(...)
end
end