Module: ActiveRecord::Acts::Versioned::ActMethods::ClassMethods

Defined in:
lib/junebug/ext/acts_as_versioned.rb

Instance Method Summary collapse

Instance Method Details

#create_versioned_table(create_table_options = {}) ⇒ Object

Rake migration task to create the versioned table using options passed to acts_as_versioned



434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
# File 'lib/junebug/ext/acts_as_versioned.rb', line 434

def create_versioned_table(create_table_options = {})
  # create version column in main table if it does not exist
  if !self.content_columns.find { |c| %w(version lock_version).include? c.name }
    self.connection.add_column table_name, :version, :integer
  end
  
  self.connection.create_table(versioned_table_name, create_table_options) do |t|
    t.column versioned_foreign_key, :integer
    t.column :version, :integer
  end
  
  updated_col = nil
  self.versioned_columns.each do |col| 
    updated_col = col if !updated_col && %(updated_at updated_on).include?(col.name)
    self.connection.add_column versioned_table_name, col.name, col.type, 
      :limit => col.limit, 
      :default => col.default
  end
        
  if type_col = self.columns_hash[inheritance_column]
    self.connection.add_column versioned_table_name, versioned_inheritance_column, type_col.type, 
      :limit => type_col.limit, 
      :default => type_col.default
  end
    
  if updated_col.nil?
    self.connection.add_column versioned_table_name, :updated_at, :timestamp
  end
end

#drop_versioned_tableObject

Rake migration task to drop the versioned table



465
466
467
# File 'lib/junebug/ext/acts_as_versioned.rb', line 465

def drop_versioned_table
  self.connection.drop_table versioned_table_name
end

#find_version(id, version) ⇒ Object

Finds a specific version of a specific row of this model



410
411
412
413
414
# File 'lib/junebug/ext/acts_as_versioned.rb', line 410

def find_version(id, version)
  find_versions(id, 
    :conditions => ["#{versioned_foreign_key} = ? AND version = ?", id, version], 
    :limit => 1).first
end

#find_versions(id, options = {}) ⇒ Object

Finds versions of a specific model. Takes an options hash like find



417
418
419
420
421
# File 'lib/junebug/ext/acts_as_versioned.rb', line 417

def find_versions(id, options = {})
  versioned_class.find :all, {
    :conditions => ["#{versioned_foreign_key} = ?", id],
    :order      => 'version' }.merge(options)
end

#versioned_classObject

Returns an instance of the dynamic versioned model



429
430
431
# File 'lib/junebug/ext/acts_as_versioned.rb', line 429

def versioned_class
  const_get versioned_class_name
end

#versioned_columnsObject

Returns an array of columns that are versioned. See non_versioned_columns



424
425
426
# File 'lib/junebug/ext/acts_as_versioned.rb', line 424

def versioned_columns
  self.columns.select { |c| !non_versioned_columns.include?(c.name) }
end

#without_locking(&block) ⇒ Object

Turns off optimistic locking for the duration of the block

Foo.without_locking do
  @foo.save
end


496
497
498
499
500
501
502
# File 'lib/junebug/ext/acts_as_versioned.rb', line 496

def without_locking(&block)
  current = ActiveRecord::Base.lock_optimistically
  ActiveRecord::Base.lock_optimistically = false if current
  result = block.call
  ActiveRecord::Base.lock_optimistically = true if current
  result
end

#without_revision(&block) ⇒ Object

Executes the block with the versioning callbacks disabled.

Foo.without_revision do
  @foo.save
end


475
476
477
478
479
480
481
482
483
484
485
486
487
488
# File 'lib/junebug/ext/acts_as_versioned.rb', line 475

def without_revision(&block)
  class_eval do 
    CALLBACKS.each do |attr_name| 
      alias_method attr_name, :empty_callback
    end
  end
  result = block.call
  class_eval do 
    CALLBACKS.each do |attr_name|
      alias_method attr_name, "orig_#{attr_name}".to_sym
    end
  end
  result
end