I want to be able to add a record which acts like a symlink. In other words I want to be able to store a record/object which will defer most attributes to another record/object.
The same as on a file system where a symlink points to another file (it own data), yet defers everything else to another file.
class Document < ActiveRecord::Base
end
class Page < Document
end
class Folder < Document
end
class Symlink < ActiveRecord::Base
set_table_name :documents
instance_methods.each { |m| undef_method m if (ActiveRecord::Base.instance_methods(false).include? m) && (!['link', 'link_id', 'link_id='].include? m) }
def method_missing(sym, *args, &block)
puts "Sending #{sym}(#{args.join(',')}) to obj"
link.__send__(sym, *args, &block)
end
def save
raise 'Symlink cant be saved' unless new_record?
super
end
private
def link
@link ||= Document.find(self.link_id)
end
end
At the moment when I try and create a new record I get a stack level too deep for 'link'.
I thought this would be a neat way of solving the problem which could be extracted in to a gem (acts_as_symlink :column => 'parent_id'
).
Another thought was to keep a full copy of the original record and use a after_save callback to update any symlinks or if the symlink is changed, update the original. So not real symlinks more like sync'd copies.
Any thoughts on my code or an alternative?