【发布时间】:2015-11-12 15:14:43
【问题描述】:
我基本上想创建一个将包含在所有多态模型中的关注点。这个问题需要有一个动态的 setter 方法来设置 '_type' 列的值。
module StiPolymorphable
extend ActiveSupport::Concern
included do
define_method "#{magic_method_to_get_type_column}=" do |type_field|
super(type_field.to_s.classify.constantize.base_class.to_s)
end
end
end
我基本上想访问 Parent 实例而不是 Person 实例的所有地址。
示例 - 假设我有以下课程
class Person < ActiveRecord::Base
end
class Parent < Person end
class Teacher < Person end
class Address < ActiveRecord::Base
include StiPolymorphable
belongs_to :addressable, polymorphic: true
end
现在,如果我尝试访问 Parent 的地址,它会给我零个记录,因为 addressable_type 字段包含值“Person”。
Parent.first.addresses => #<ActiveRecord::Associations::CollectionProxy []>
Person.first.addresses => #<ActiveRecord::Associations::CollectionProxy [#<Address id: .....>]>
【问题讨论】:
-
您能否详细说明您将如何使用该模块?
-
我基本上是在尝试将这个模块包含在我的应用程序的所有多态模型中,这些模型可以属于 STI 模型。
-
@MaxWilliams 我试图让多态实例访问所属 STI 模型的基类。如果这有任何意义的话。我将编辑问题以提供更好的示例。
-
您能否创建一个示例来说明您想要的结果。也许将 STI 模型示例添加到 OP。
-
@usmanali,为了清楚起见,我添加了一个示例
标签: ruby-on-rails ruby ruby-on-rails-4 polymorphism metaprogramming