共享多态关联模型

时间:2010-10-11 15:52:14

标签: ruby-on-rails polymorphism polymorphic-associations

假设一个多态关联,比如'业务'和'员工',这两者都是'可以容纳的'(意味着他们有几个小时分配给他们)。 “小时”模型在业务对象或员工对象的工作时间内执行相同方法的建议方法是什么?

举一个简单的例子,'hour'模型可能包含:

  def self.find_hours_for_id(id)
    Business.find( id ).hours
  end

但是,我可能想在Staff成员上执行相同的方法,在这种情况下,相同的方法将调用等效的

Staff.find( id ).hours

在基础模型类中设置模型名称是好还是坏:

class BusinessHour < Hour
  @mymodel = "Business"
end

class Hour < ActiveRecord::Base
  def self.find_hours_for_id(id)
    @mymodel.constantize.find( id ).hours
  end
end

然后从控制器调用:

BusinessHour.find_hours_for_id(id)

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

您也可以使用模块。

module Hour
  def hours_by(model)
    class_eval do
      def self.find_hours_for_id(id)
        model.find(id).hours
      end
    end
  end
end

class BusinessHour < AR
  extends Hour
  hours_by Business
end

BusinessHour.find_hours_for_id(id)

答案 1 :(得分:1)

假设,例如,您的对象模型如下:

class Business < ActiveRecord::Base
  has_many :hours, :as => :hourable
end

class Staff < ActiveRecord::Base
  has_many :hours, :as => :hourable
end

class Hour < ActiveRecord::Base
  belongs_to :hourable, :polymorphic => true
end

class BusinessHour < Hour
  # etc
end

然后你已经在'hourable'中引用了你需要的类,你可以按如下方式添加finder:

class Hour < ActiveRecord::Base
  belongs_to :hourable, :polymorphic => true

  def self.get_hours_by_hourable_id(id)
    hourable.class.find(id).hours
  end
end

只是一个建议,但您可以考虑对子类进行验证,以保证:hourable是合适的类型,例如:

class BusinessHour < Hour
  validates :hourable_must_be_business

  def hourable_must_be_business
    unless hourable_type == 'Business'
      self.errors.add_to_base("Hourable for BusinessHour must be Business") 
    end
  end
end