尝试将模型代码移动到共享问题

时间:2014-11-16 02:19:01

标签: ruby-on-rails rails-activerecord

我有一个模型,其中包含以下两种方法,这些方法在另一个模型中是必需的,因此我认为我尝试通过关注点共享它们而不是复制代码。

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;

1 个答案:

答案 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