lib/monarchy/acts_as_resource.rb in monarchy-0.3.1 vs lib/monarchy/acts_as_resource.rb in monarchy-1.0.0
- old
+ new
@@ -4,44 +4,44 @@
extend ActiveSupport::Concern
module ClassMethods
def acts_as_resource(options = {})
extend Monarchy::ActsAsResource::SupportMethods
+ setup_acting
parent_as(options[:parent_as]) if options[:parent_as]
after_create :ensure_hierarchy
+ after_save :assign_parent
- has_many :members, through: :hierarchy, class_name: 'Monarchy::Member'
- has_many :users, through: :members, class_name: 'User'
+ has_many :members, through: :hierarchy, class_name: "::#{Monarchy.member_class}"
+ has_many :users, through: :members, class_name: "::#{Monarchy.user_class}"
has_one :hierarchy, as: :resource, dependent: :destroy, class_name: 'Monarchy::Hierarchy'
include_scopes
include Monarchy::ActsAsResource::InstanceMethods
end
end
module SupportMethods
+ attr_accessor :parentize, :acting_as_resource
+
private
- def parent_as(name)
- define_method "#{name}=" do |value|
- self.parent = value
- super(value)
- end
+ def setup_acting
+ Monarchy.resource_classes << self
+ @acting_as_resource = true
+ end
- define_method "#{name}_id=" do |id|
- class_name = name.to_s.camelize.safe_constantize
- self.parent = class_name.find(id)
- super(id)
- end
+ def parent_as(name)
+ self.parentize = name
end
def include_scopes
scope :in, (lambda do |resource|
- joins(:hierarchy).where(monarchy_hierarchies: { parent_id: resource.hierarchy.self_and_descendant_ids })
+ joins(:hierarchy).where(monarchy_hierarchies: { parent_id: resource.hierarchy.self_and_descendants })
end)
scope :accessible_for, (lambda do |user|
joins(:hierarchy).where(monarchy_hierarchies: { id: Monarchy::Hierarchy.accessible_for(user) })
end)
@@ -76,9 +76,14 @@
self.hierarchy ||= Monarchy::Hierarchy.create(
resource: self,
parent: parent.try(:hierarchy),
children: hierarchies_for(children)
)
+ end
+
+ def assign_parent(force = false)
+ parent = self.class.parentize
+ self.parent = send(parent) if parent && (send("#{parent}_id_changed?") || force)
end
def children_resources
c = hierarchy.try(:children)
return nil if c.nil?