好吧,我似乎已经破解了它,关键是用遵从另一个对象的方法替换访问数据库列的方法。通过使用id方法,我还可以确定
save
将属性保存到符号链接或原始记录。
Document
我的情况是
acts_as_tree
acts_as_list
所以我排除在外
parent_id
和
position
class Symlink < Document
attr_accessor :save_to
self.columns.map { |c| c.name }.reject { |c| %w(position parent_id sync_id).include? c }.each do | col |
self.send :define_method, col.to_sym do
source.send(col)
end
end
def id
if save_to == :symlink
return read_attribute(:id)
else
return source.send :id
end
end
def copy?
!sync_id.nil?
end
private
def source
if sync_id
@source ||= Document.find(sync_id)
else
Document.new
end
end
end
到目前为止,只在控制台中进行了测试,但这不应该在整个堆栈中工作的原因是什么。
如果它成功的话,我会认为把它抽象成一个通用的行为就像一个符号链接的宝石。