带有permalink_fu的子类Activerecord在铁轨引擎中
-
01-10-2019 - |
题
这个问题与Ruby中的类方法有关,也许更具体地以Permalink_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_fu在引起此问题的方式中是否有些东西混合在一起?
我正在使用永久链接-V.1.0.0宝石 http://github.com/goncalossilva/permalink_fu
解决方案
在研究此之后,我现在可以看到该问题与永久链接验证它应该创建永久链接的方式有关。它通过检查类的永久链接field是否为空白来验证这一点。
什么是permalink_field?当你这样做的时候
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
如果是这样,可以通过写作可以访问永久链接 Parent.new.custom_permalink_name
(或者 Child.new.custom_permalink_name
).
这有什么问题? permalink_field访问者方法定义 Parent
的Metaclass:
class << self
attr_accessor :permalink_field
end
当您运行has_permalink方法时,它会调用 Parent.permalink_field = 'permalink'
.
问题是,尽管 permalink_field
方法 在所有子类上可用, 价值 存储在该班级中。这意味着该值不传播到子类。
所以,作为 permalink_field
存储在 Parent
班级,尽管孩子继承了访问者方法,但孩子没有继承该值。作为 Child.permalink_field
是空白的, should_create_permalink?
返回 false
, , 和 Child.create :name => 'something'
不会创建永久链接。
一种可能的解决方案是用cattr_accessors在类上替换Metaclass上的attr_acessors(permalink_fu.rb文件上的第57至61行)。
代替
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
请注意,这将使子类上的任何可能的自定义无效。您将不再能够为子类指定不同的选项,因为这三个属性由 Parent
及其所有子类(和亚班级)。