Вопрос внизу, но код описывает большую его часть:)
Вот база кода, сокращенная, чтобы добраться до его сути:
ActiveRecord::Base.class_eval do
def self.joins(*others)
has_many :parent_join_models, :as => :child
has_many :child_join_models, :as => :parent
options = others.extract_options!
through = (options[:as] || :parent).to_s + "_join_models"
others.each do |other|
has_many other, :through => through.to_sym
end
end
end
class Group < ActiveRecord::Base
joins :images, :class_name => "Image", :as => :parent
joins :photos, :class_name => "Image", :as => :parent
end
class SubGroup < ActiveRecord::Base
joins :pictures, :class_name => "Image", :as => :parent
end
class Image < ActiveRecord::Base
end
class JoinModel
belongs_to :parent, :polymorphic => true
belongs_to :child, :polymorphic => true
end
И вот что происходит, когда вы его используете:
group = Group.create!
subgroup = SubGroup.create!
image = Image.create!
group.images << image
puts JoinModel.all
#=> [#<JoinModel id: 1, parent_id: 1, parent_type: "Group", child_id: 1, child_type: "Image">]
JoinModel.destroy_all
subgroup.images << image
puts JoinModel.all
#=> [#<JoinModel id: 2, parent_id: 1, parent_type: "Group", child_id: 1, child_type: "Image">]
Мой вопрос: как мне сделать так, чтобы при создании этой модели соединения из подкласса, с которым она ассоциируется через subgroup.images << image
, чтоскажет parent_type: "SubGroup"
вместо Group
?Я никогда не мог понять это.
Обновление
Если я изменю эту одну строку в ядре ActiveRecord, она отлично работает:
module ActiveRecord
module Associations
class HasManyThroughAssociation < HasManyAssociation
protected
def construct_owner_attributes(reflection)
if as = reflection.options[:as]
{ "#{as}_id" => @owner.id,
# CHANGE 'class.base_class' to 'class'
"#{as}_type" => @owner.class.base_class.name.to_s }
else
{ reflection.primary_key_name => @owner.id }
end
end
end
end
end
... это ошибка?