Module: Archive2s::ClassMethods
- Defined in:
- lib/archive_2s.rb,
lib/archive_2s.rb
Instance Method Summary collapse
Instance Method Details
#archive_2s(args = {}) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/archive_2s.rb', line 8 def archive_2s(args = {}) # don't allow multiple calls return if self.included_modules.include?(Archive2s::InstanceMethods) include InstanceMethods extend ClassMethods singleton = class << self; self; end singleton.module_eval do define_method(:archive_2s_args) do @archive_2s_args end define_method(:archive_2s_args=) do |value| @archive_2s_args = value end end self.archive_2s_args = Archive2s::DEFAULT_ARGUMENTS.merge(args) #TODO: make some proxy magic so if one calls a relationship if can search the archive too if self.archive_2s_args[:include_by_default] singleton.module_eval do def find(*args) super rescue self.find_with_archived(args) end end end end |
#find_archived(*ids) ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/archive_2s.rb', line 55 def find_archived(*ids) ids.flatten! #don't use scopes so it is rails 2 and 3 compliant archived_models = ::Archive2s::Model.all(:conditions => ["model_type = ? AND model_id IN (#{(['?'] * ids.length).join(',')})", self.to_s, *ids]).collect(&:model) if archived_models.length != ids.length if ids.length == 1 raise ActiveRecord::RecordNotFound, "Couldn't find Archived #{self.to_s} with ID=#{ids.first}" else raise ActiveRecord::RecordNotFound, "Couldn't find all Archived #{self.to_s.pluralize} with IDs (#{ids.join(',')})" end end #TODO: use wants if archived_models.length > 1 archived_models else archived_models.first end end |
#find_with_archived(*args) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/archive_2s.rb', line 76 def find_with_archived(*args) begin #might as well try AR first super.find(args) rescue Exception => e #can only fetch archived by ids so don't attempt if there were extra args if args.flatten! && args.length != args.select{|i| i == i.to_i}.length raise e else items = self.all(:conditions => ["id IN (#{(['?'] * args.length).join(',')})", *args]) items += [self.find_archived(*args - items.collect(&:id))].flatten if args.length == items.length items else raise e end end end end |