所以,如果我在整个应用程序中都有多态关联,有没有办法为它添加方法?例如,如果:post,:photo和:user都与:具有名为:rankable的多态关联的排名相关联,我可以以某种方式创建方法:rankable然后将继承:post,:photo或:user?我的猜测是,如果可能的话,我需要在应用程序中添加一个Rankable模型并在其中定义方法。那可能吗?如果是这样,我在需要创建模型时是正确的,该模型将继承哪个类,或者如何将其定义为多态关系?
答案 0 :(得分:3)
我不知道你是如何用模型做的,但你可以轻松地用mixin添加方法:
module RankableMethods
def do_something_useful
...
end
end
class Post < ActiveRecord::Base
include RankableMethods
belongs_to :rankable, :polymorphic = true
end
p = Post.new
p.respond_to?(:do_something_useful) # true
答案 1 :(得分:1)
你必须将'polymorphic'的概念与适用于ActiveRecord多态关联的概念分开,并将经典的OOP继承意义中的'polymorphic'分开。
第一种意义上的'可排列'多态类型不存在,除非作为ActiveRecord中的数据库约定,它允许一个表中的记录引用多个可能的其他表中的记录。如果你想在你的对象模型中更具体地表达这种抽象 - 第二种意义上的多态 - 你必须声明一个单独的类或模块,你的'Rankable'ActiveRecords可以混合或继承。