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

Defined in:
lib/plugins/acts_as_versioned/lib/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


488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
# File 'lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb', line 488

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,
      :scale => col.scale,
      :precision => col.precision
  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,
      :scale => type_col.scale,
      :precision => type_col.precision
  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


523
524
525
# File 'lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb', line 523

def drop_versioned_table
  self.connection.drop_table versioned_table_name
end

#find_version(id, version = nil) ⇒ Object

Finds a specific version of a specific row of this model


457
458
459
460
461
462
463
464
465
466
467
468
# File 'lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb', line 457

def find_version(id, version = nil)
  return find(id) unless version

  conditions = ["#{versioned_foreign_key} = ? AND version = ?", id, version]
  options = { :conditions => conditions, :limit => 1 }

  if result = find_versions(id, options).first
    result
  else
    raise RecordNotFound, "Couldn't find #{name} with ID=#{id} and VERSION=#{version}"
  end
end

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

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


471
472
473
474
475
# File 'lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb', line 471

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

#versioned_classObject

Returns an instance of the dynamic versioned model


483
484
485
# File 'lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb', line 483

def versioned_class
  const_get versioned_class_name
end

#versioned_columnsObject

Returns an array of columns that are versioned. See non_versioned_columns


478
479
480
# File 'lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb', line 478

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

555
556
557
558
559
560
561
# File 'lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb', line 555

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

533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
# File 'lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb', line 533

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