Только что была эта проблема в Rails 4.2
.Я нашел два способа решения:
-
Проблема в том, что Rails использует base_class
имя отношения STI.
Причина этого была задокументирована в других ответах, но суть в том, что основная команда, кажется, считает, что вы должны иметь возможность ссылаться на таблицу , а не класс для полиморфной ассоциации с ИППП.
Я не согласен с этой идеей, но не являюсь частью команды Rails Core, поэтому не имею большого вклада в ее решение.
Есть два способа исправить это:
-
1) Вставить на уровне модели:
class Association < ActiveRecord::Base
belongs_to :associatiable, polymorphic: true
belongs_to :associated, polymorphic: true
before_validation :set_type
def set_type
self.associated_type = associated.class.name
end
end
Это изменит {x}_type
запись до создания данных в БД.Это работает очень хорошо и все еще сохраняет полиморфный характер ассоциации.
2) Переопределить ядро ActiveRecord
методы
#app/config/initializers/sti_base.rb
require "active_record"
require "active_record_extension"
ActiveRecord::Base.store_base_sti_class = false
#lib/active_record_extension.rb
module ActiveRecordExtension #-> /1668051/relsy-rasshiryayschie-activerecord-base
extend ActiveSupport::Concern
included do
class_attribute :store_base_sti_class
self.store_base_sti_class = true
end
end
# include the extension
ActiveRecord::Base.send(:include, ActiveRecordExtension)
####
module AddPolymorphic
extend ActiveSupport::Concern
included do #-> http://stackoverflow.com/questions/28214874/overriding-methods-in-an-activesupportconcern-module-which-are-defined-by-a-cl
define_method :replace_keys do |record=nil|
super(record)
owner[reflection.foreign_type] = ActiveRecord::Base.store_base_sti_class ? record.class.base_class.name : record.class.name
end
end
end
ActiveRecord::Associations::BelongsToPolymorphicAssociation.send(:include, AddPolymorphic)
Более системный способ исправить проблему - это отредактироватьActiveRecord
основные методы, которые управляют этим.Я использовал ссылки в этом геме , чтобы выяснить, какие элементы необходимо исправить / переопределить.
Это не проверено и все еще нуждается в расширениях для некоторых других частей основных методов ActiveRecord, ноКажется, работает для моей локальной системы.