代码之家  ›  专栏  ›  技术社区  ›  Kris

如何使用BlankSlate和代理模式在记录之间创建符号链接?

  •  0
  • Kris  · 技术社区  · 17 年前

    我希望能够添加一个像符号链接一样的记录。换句话说,我希望能够存储一个记录/对象,它将大多数属性延迟到另一个记录/对象。

    与在文件系统上相同,在文件系统中,符号链接指向另一个文件(它拥有数据),但将其他所有内容都推迟到另一个文件。

    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
    

    当我尝试创建一个新记录时,我得到的堆栈级别对于“链接”来说太深了。

    我认为这将是一个解决问题的好方法,它可以被提取到宝石中( acts_as_symlink :column => 'parent_id'

    1 回复  |  直到 17 年前
        1
  •  0
  •   Kris    16 年前

    好吧,我似乎已经破解了它,关键是用遵从另一个对象的方法替换访问数据库列的方法。通过使用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
    

    到目前为止,只在控制台中进行了测试,但这不应该在整个堆栈中工作的原因是什么。

    如果它成功的话,我会认为把它抽象成一个通用的行为就像一个符号链接的宝石。

    推荐文章