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

在rails引擎中用permalink\u fu子类化ActiveRecord

  •  1
  • aceofspades  · 技术社区  · 14 年前

    这个问题与在Ruby中扩展类方法有关,也许更具体地说是以permalinkèu fu这样做的方式。

    看来 has_permalink 在派生模型中不可用。当然,我希望类中定义的任何东西都能被其派生类继承。

    class MyScope::MyClass < ActiveRecord::Base
      unloadable
      self.abstract_class = true
      has_permalink :name
    end
    
    class MyClass < MyScope::MyClass
      unloadable
      #has_permalink :name # This seems to be required
    end
    

    我用的是permalink-v.1.0.0 gem http://github.com/goncalossilva/permalink_fu

    1 回复  |  直到 14 年前
        1
  •  0
  •   Hugo Peixoto    14 年前

    在研究了这个问题之后,我现在可以看到问题与permalink\u-fu如何验证它是否应该创建permalink有关。它通过检查类的permalink\u字段是否为空来验证这一点。

    永久磁场是什么?当你这么做的时候

    class Parent < ActiveRecord::Base
      has_permalink :name
    end
    
    class Child < Parent
    end
    

    您可以通过写入 Parent.new.permalink Child.new.permalink . 可以通过写入

    class Parent < ActiveRecord::Base
      has_permalink :name 'custom_permalink_name'
    end
    

    如果是这样,permalink将可以通过写入 Parent.new.custom_permalink_name (或 Child.new.custom_permalink_name ).

    这有什么问题?permalink\u字段访问器方法在上定义 Parent 的元类:

    class << self
      attr_accessor :permalink_field
    end
    

    Parent.permalink_field = 'permalink' .

    问题是尽管 permalink_field 在所有子类上可用,其 价值 存储在调用它的类上。这意味着该值不会传播到子类。

    所以,作为 永久性油田 存储在 类时,子级不继承该值,尽管它继承了访问器方法。作为 Child.permalink_field should_create_permalink? 退货 false Child.create :name => 'something' 不会创建永久链接。

    一个可能的解决方案是将元类上的attr\u访问器替换为类上的cattr\u访问器(permalink上的第57到61行)_fu.rb公司文件)。

    替换

    class << base
      attr_accessor :permalink_options
      attr_accessor :permalink_attributes
      attr_accessor :permalink_field
    end
    

    具有

    base.cattr_accessor :permalink_options
    base.cattr_accessor :permalink_attributes
    base.cattr_accessor :permalink_field
    

    请注意,这将使子类上任何可能的自定义无效。您将不能再为子类指定不同的选项,因为这三个属性是由共享的 起源 以及它的所有子类(和子类)。