lib/active_metadata/base.rb in active_metadata-0.7.4 vs lib/active_metadata/base.rb in active_metadata-0.7.5
- old
+ new
@@ -1,10 +1,14 @@
module ActiveMetadata
CONFIG = File.exists?('config/active_metadata.yml') ? YAML.load_file('config/active_metadata.yml')[Rails.env] : {}
CONFIG['cache_expires_in'] ||= 60
+ def self.skip_history?
+ false
+ end
+
## Define ModelMethods
module Base
require 'active_metadata/helpers'
require 'active_metadata/stream'
@@ -18,16 +22,20 @@
end
module Config
def acts_as_metadata *args
+ options = args.extract_options!
+ options[:ancestors] ||= []
+ options[:persists_ancestor] ||= false
+
before_update :manage_concurrency
after_save :save_history
attr_accessor :conflicts
attr_accessor :active_metadata_timestamp
- class_variable_set("@@active_metadata_ancestors", args.empty? ? nil : args[0][:active_metadata_ancestors])
+ instance_variable_set("@active_metadata_options", options)
include ActiveMetadata::Base::InstanceMethods
include ActiveMetadata::Persistence
include ActiveMetadata::Stream
@@ -54,16 +62,20 @@
end
end
end
- def metadata_id
- metadata_root.id
+ # if force is set to true go directly to the private find method
+ # options integrity will not be checked and ancestor will be looked also if option persists_ancestor is false
+ # usefull to get the ancestor instance also if is not persisted
+ def metadata_id force=false
+ force ? find_metadata_ancestor_instance.id : metadata_root.id
end
- def metadata_class
- metadata_root.class.to_s
+ # same as #metadata_id
+ def metadata_class force=false
+ force ? find_metadata_ancestor_instance.class.to_s : metadata_root.class.to_s
end
# Normalize the active_metadata_timestamp into a float to be comparable with the history
def am_timestamp
ts = metadata_root.active_metadata_timestamp
@@ -78,18 +90,13 @@
nil
end
end
def metadata_root
- active_metadata_ancestors = self.class.class_variable_get("@@active_metadata_ancestors")
- return self if active_metadata_ancestors.nil?
- receiver = self
- active_metadata_ancestors.each do |item|
- receiver = receiver.send item
- end
- raise(RuntimeError.new,"[active_metdata] - Ancestor model is not yet persisted") unless receiver
- receiver
+ options = self.class.instance_variable_get("@active_metadata_options")
+ return self unless (options[:persists_ancestor] && options[:ancestors].size > 0 )
+ find_metadata_ancestor_instance
end
# Resolve concurrency using the provided timestamps and the active_metadata histories.
# Conflicts are stored into @conflicts instance variable
# Timestamp used for versioning can be passed both as :
@@ -153,9 +160,21 @@
end
end
+ end
+
+ private
+
+ def find_metadata_ancestor_instance
+ receiver = self
+ self.class.instance_variable_get("@active_metadata_options")[:ancestors].each do |item|
+ res = receiver.send item
+ receiver = res.is_a?(Array) ? res.first : res
+ end
+ raise(RuntimeError.new,"[active_metdata] - Ancestor model is not yet persisted") unless receiver
+ receiver
end
end # InstanceMethods
end