ruby on rails 3 - DRYup shared model validations on before_destroy -
to prevent removal of related records, applying before_destroy callbacks approach on each model
i defined several related-records validation methods in module, can shared different models' before_destroy callbacks:
class teacher < activerecord::base include relatedmodels before_destroy :has_courses ... end class level < activerecord::base include relatedmodels before_destroy :has_courses ... end module relatedmodels def has_courses if self.courses.any? self.errors[:base] << "you cannot delete while associated courses exists" return false end end def has_reports if self.reports.any? self.errors[:base] << "you cannot delete while associated reports exists" return false end end def has_students if self.students.any? self.errors[:base] << "you cannot delete while associated students exists" return false end end ... end
but doesn't looks dry
any idea how in single method? meta-programming it's not among skills
thanks in advance
you might want try observer class
these depreciated in rails 4 (you have use rails-observers
gem), seem still part of rails 3 core
observer classes
"listen" specified actions in model, , provide extended functionality. stated documentation, particularly de-cluttering models, allowing combine lot of functionality 1 central set of functions
here's might want (please bare in mind have used these in rails 4):
class relatedobserver < activerecord::observer observe :teachers, :school def before_destroy(record) associations = %w(teachers schools reports) associations.each |association| if record.send(association).any? self.errors[:base] << "you cannot delete while associated #{association.pluralize} exists" return false end end end end
here's good resource you
Comments
Post a Comment