【问题标题】:How to add methods to a rails polymorphic association?如何将方法添加到 Rails 多态关联?
【发布时间】:2010-10-02 02:47:00
【问题描述】:
那么,如果我在整个应用程序中都有一个多态关联,有没有办法向它添加方法?例如,如果 :post、:photo 和 :user 都与 :rankings 相关联并具有名为 :rankable 的多态关联,我能否以某种方式在 :rankable 上创建方法,然后由 :post、:photo 或 :user 继承?我的猜测是,如果可能的话,我需要向应用程序添加一个 Rankable 模型并在其中定义方法。那可能吗?如果是这样,并且我需要创建一个模型是正确的,那么该模型将从哪个类继承或者我将如何将其定义为这种多态关系?
【问题讨论】:
标签:
ruby-on-rails
class
methods
polymorphic-associations
【解决方案1】:
我不知道你会如何使用模型来做到这一点,但你可以使用 mixins 轻松添加方法:
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
【解决方案2】:
您必须将应用于 ActiveRecord 多态关联的“多态”概念与经典 OOP 继承意义中的“多态”概念分开。
第一种意义上的“可排名”多态类型不存在,除非作为 ActiveRecord 中的数据库约定,它允许一个表中的记录引用多个可能的其他表中的记录。如果你想在你的对象模型中更具体地表达这种抽象——第二种意义上的多态——你必须声明一个单独的类或模块,你的“Rankable”ActiveRecords 可以混合或继承自。