Присоединиться к модели + STI + Полиморфные ассоциации - ActiveRecord может этого не делать? - PullRequest
1 голос
/ 11 сентября 2010

Вопрос внизу, но код описывает большую его часть:)

Вот база кода, сокращенная, чтобы добраться до его сути:

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

... это ошибка?

...