Skip to content
This repository was archived by the owner on Feb 9, 2019. It is now read-only.

Predecessor does not *always* have an Heir #11

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions heritage_demo/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
db/*.sqlite3
log/*.log
tmp/
.idea

5 changes: 3 additions & 2 deletions heritage_demo/Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ group :test do
gem 'rspec-rails'
gem 'factory_girl_rails'
gem 'autotest'
gem 'autotest-fsevent'
gem 'autotest-growl'
# MacOSX only
# gem 'autotest-fsevent'
# gem 'autotest-growl'
end
6 changes: 0 additions & 6 deletions heritage_demo/Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,6 @@ GEM
arel (2.0.9)
autotest (4.4.6)
ZenTest (>= 4.4.1)
autotest-fsevent (0.2.7)
sys-uname
autotest-growl (0.2.16)
builder (2.1.2)
diff-lcs (1.1.3)
erubis (2.6.6)
Expand Down Expand Up @@ -90,7 +87,6 @@ GEM
railties (~> 3.0)
rspec (~> 2.7.0)
sqlite3 (1.3.3)
sys-uname (0.8.6)
thor (0.14.6)
treetop (1.4.9)
polyglot (>= 0.3.1)
Expand All @@ -101,8 +97,6 @@ PLATFORMS

DEPENDENCIES
autotest
autotest-fsevent
autotest-growl
factory_girl_rails
heritage!
rails (= 3.0.6)
Expand Down
14 changes: 0 additions & 14 deletions heritage_demo/db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,6 @@

ActiveRecord::Schema.define(:version => 20110412094758) do

create_table "_blog_posts_old_20110411", :force => true do |t|
t.integer "predecessor_id"
t.text "body"
t.datetime "created_at"
t.datetime "updated_at"
end

create_table "_image_posts_old_20110411", :force => true do |t|
t.integer "predecessor_id"
t.integer "aspect"
t.datetime "created_at"
t.datetime "updated_at"
end

create_table "blog_posts", :force => true do |t|
t.text "body"
end
Expand Down
42 changes: 31 additions & 11 deletions lib/heritage/active_record/acts_as_heir.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,49 @@ module Heritage
module ActiveRecord
module ActsAsHeir

def child_of(parent_symbol)
acts_as_heir_of(parent_symbol)
def child_of(parent_symbol, params = nil)
acts_as_heir_of(parent_symbol, params)
end

def acts_as_heir_of(predecessor_symbol)
def acts_as_heir_of(predecessor_symbol, params = nil)
extend ClassMethods
include InstanceMethods

class_attribute :_predecessor_klass, :_predecessor_symbol
self._predecessor_symbol = predecessor_symbol
self._predecessor_klass = Object.const_get(predecessor_symbol.to_s.capitalize)
if defined? params and not params.nil? and defined? params[:class] and not params[:class].nil? then
self._predecessor_klass = params[:class].constantize
else
self._predecessor_klass = predecessor_symbol.to_s.camelcase.constantize
end

has_one :predecessor, :as => :heir, :class_name => predecessor_symbol.to_s.capitalize, :autosave => true, :dependent => :destroy
has_one :predecessor, :as => :heir, :class_name => self._predecessor_klass.to_s, :autosave => true, :dependent => :destroy

alias_method_chain :predecessor, :build

# Expose columns from the predecessor
self._predecessor_klass.columns.reject{|c| c.primary || c.name =~ /^heir_/}.map(&:name).each do |att|
define_method(att) do
predecessor.send(att)
self._predecessor_klass.columns.reject{|c| c.primary and not ["id", "created_at", "updated_at"].include?(c.name) }.each do |att|
if att.primary then
if ( defined? params[:include_predecessor_id] and not params[:include_predecessor_id].nil? and params[:include_predecessor_id] == true) then
define_method(predecessor_symbol.to_s.underscore + "_id") do
predecessor.send(att.name)
end
end
next
end

if att.name =~ /^heir_/ then
define_method(predecessor_symbol.to_s.underscore + att.name) do
predecessor.send(att.name)
end
next
end

define_method(att.name) do
predecessor.send(att.name)
end
define_method("#{att}=") do |val|
predecessor.send("#{att}=",val)
define_method("#{att.name}=") do |val|
predecessor.send("#{att.name}=",val)
end
end

Expand Down Expand Up @@ -71,4 +91,4 @@ def touch_predecessor

end
end
end
end
4 changes: 2 additions & 2 deletions lib/heritage/active_record/acts_as_predecessor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def acts_as_predecessor(options = {})

belongs_to :heir, :polymorphic => true

before_update :touch_heir, :unless => lambda { heir.changed? }
before_update :touch_heir, :unless => lambda { heir && heir.changed? }
end

module ClassMethods
Expand All @@ -30,7 +30,7 @@ def get_heritage_exposed_methods

module InstanceMethods
def touch_heir
if self.changed?
if self.changed? && heir
heir.touch
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/heritage/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module Heritage
VERSION = "0.3.1"
VERSION = "0.3.1.2"
end