1

我基本上想創建一個關注點,它將包含在所有的多態模型中。這個問題需要有一個動態的setter方法來設置'_type'列的值。Rails:如何動態檢索多態模型的多態'_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 

我基本上想訪問一個父實例,而不是一個人實例的所有地址。

示例 - 假設我有以下類

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 

現在,如果我嘗試訪問父它給了我零記錄以來的addressable_type字段包含值「人」的地址。

Parent.first.addresses => #<ActiveRecord::Associations::CollectionProxy []> 
Person.first.addresses => #<ActiveRecord::Associations::CollectionProxy [#<Address id: .....>]> 
+0

你能給的你將如何使用這個模塊的更多細節? –

+0

我基本上試圖在我的應用程序中可以屬於STI模型的所有多態模型中包含此模塊。 – KcC0

+0

@MaxWilliams我試圖讓多態實例訪問所屬STI模型的基類。如果這是有道理的。 我會編輯問題以提供更好的示例。 – KcC0

回答

0

您可能有興趣查看Modularity寶石,因此您可以在包含模塊時傳遞變量。雖然沒有真正嘗試過。希望能幫助到你。

+0

這對我來說真的沒有多大幫助。不過謝謝。 – KcC0

0

我們做這樣的事情:

module Shared::PolymorphicAnnotator 
    extend ActiveSupport::Concern 

    class_methods do 
    # @return [String] 
    # the polymorphic _id column 
    def annotator_id 
     reflections[annotator_reflection].foreign_key.to_s 
    end 

    # @return [String] 
    # the polymorphic _type column 
    def annotator_type 
     reflections[annotator_reflection].foreign_type 
    end 
    end 

    included do 
    # Concern implementation macro 
    def self.polymorphic_annotates(polymorphic_belongs, foreign_key = nil) 
     belongs_to polymorphic_belongs.to_sym, polymorphic: true, foreign_key: (foreign_key.nil? ? (polymorphic_belongs.to_s + '_id').to_s : polymorphic_belongs.to_s) 
     alias_attribute :annotated_object, polymorphic_belongs.to_sym 

     define_singleton_method(:annotator_reflection){polymorphic_belongs.to_s} 
    end 

    attr_accessor :annotated_global_entity 

    # @return [String] 
    # the global_id of the annotated object 
    def annotated_global_entity 
     annotated_object.to_global_id if annotated_object.present? 
    end 

    # @return [True] 
    # set the object when passed a global_id String 
    def annotated_global_entity=(entity) 
     o = GlobalID::Locator.locate entity 

     write_attribute(self.class.annotator_id, o.id) 
     write_attribute(self.class.annotator_type, o.class.base_class) 
     true 
    end 
    end 
end 

在你的模型:

class Foo 
    include Shared::PolymorphicAnnotator 
    polymorphic_annotates('belongs_to_name', 'foreign_key') 
end