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