Module: ActiveRecord::Acts::Versioned::ActMethods::ClassMethods
- Defined in:
- lib/acts_as_versioned.rb
Instance Method Summary collapse
-
#create_versioned_table(create_table_options = {}) ⇒ Object
Rake migration task to create the versioned table using options passed to acts_as_versioned.
-
#drop_versioned_table ⇒ Object
Rake migration task to drop the versioned table.
-
#find_version(id, version = nil) ⇒ Object
Finds a specific version of a specific row of this model.
-
#find_versions(id, options = {}) ⇒ Object
Finds versions of a specific model.
-
#versioned_class ⇒ Object
Returns an instance of the dynamic versioned model.
-
#versioned_columns ⇒ Object
Returns an array of columns that are versioned.
-
#without_locking(&block) ⇒ Object
Turns off optimistic locking for the duration of the block.
-
#without_revision(&block) ⇒ Object
Executes the block with the versioning callbacks disabled.
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
463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 |
# File 'lib/acts_as_versioned.rb', line 463 def create_versioned_table( = {}) # 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, ) 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_table ⇒ Object
Rake migration task to drop the versioned table
498 499 500 |
# File 'lib/acts_as_versioned.rb', line 498 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
432 433 434 435 436 437 438 439 440 441 442 443 |
# File 'lib/acts_as_versioned.rb', line 432 def find_version(id, version = nil) return find(id) unless version conditions = ["#{versioned_foreign_key} = ? AND version = ?", id, version] = { :conditions => conditions, :limit => 1 } if result = find_versions(id, ).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
446 447 448 449 450 |
# File 'lib/acts_as_versioned.rb', line 446 def find_versions(id, = {}) versioned_class.find :all, { :conditions => ["#{versioned_foreign_key} = ?", id], :order => 'version' }.merge() end |
#versioned_class ⇒ Object
Returns an instance of the dynamic versioned model
458 459 460 |
# File 'lib/acts_as_versioned.rb', line 458 def versioned_class const_get versioned_class_name end |
#versioned_columns ⇒ Object
Returns an array of columns that are versioned. See non_versioned_columns
453 454 455 |
# File 'lib/acts_as_versioned.rb', line 453 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
530 531 532 533 534 535 536 |
# File 'lib/acts_as_versioned.rb', line 530 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
508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 |
# File 'lib/acts_as_versioned.rb', line 508 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 |