假设一个多态关联,比如'业务'和'员工',这两者都是'可以容纳的'(意味着他们有几个小时分配给他们)。 “小时”模型在业务对象或员工对象的工作时间内执行相同方法的建议方法是什么?
举一个简单的例子,'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)
有更好的解决方案吗?
答案 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