Rails 5.0 не получает полиморфную ассоциацию при использовании STI - PullRequest
0 голосов
/ 18 сентября 2018
gem 'rails', '4.2.7.1'

class Property < Accommodation  
   has_many :attachments, as: :attached_item, dependent: :destroy  
end

class Accommodation < ActiveRecord::Base;
end

class Attachment < ActiveRecord::Base
     belongs_to :attached_item, polymorphic: true
end

Ассоциация прекрасно работает в rails 4.2

Property.last.attachments
 Property Load (0.9ms)  SELECT  "accommodations".* FROM "accommodations" WHERE "accommodations"."type" IN ('Property')  ORDER BY "accommodations"."id" DESC LIMIT 1
 Attachment Load (0.5ms)  SELECT "attachments".* FROM "attachments" WHERE "attachments"."attached_item_id" = $1 AND "attachments"."attached_item_type" = $2  [["attached_item_id", 1], ["attached_item_type", "Property"]]

Аналогичная ассоциация в Rails 5.0

class CustomInquiry < ApplicationRecord;
end

class ChildInquiry < CustomInquiry  
     has_many :text_histories, as: :mailed_item, dependent: :delete_all
end

class TextHistory < ApplicationRecord
    belongs_to :mailed_item, polymorphic: true
end

2.4.0 :002 > ChildInquiry.last.text_histories
 ChildInquiry Load (1.2ms)  SELECT  "custom_inquiries".* FROM "custom_inquiries" WHERE "custom_inquiries"."type" IN ('ChildInquiry') ORDER BY "custom_inquiries"."id" DESC LIMIT $1  [["LIMIT", 1]]
 TextHistory Load (0.4ms)  SELECT "text_histories".* FROM "text_histories" WHERE "text_histories"."mailed_item_id" = $1 AND "text_histories"."mailed_item_type" = $2  [["mailed_item_id", 197], ["mailed_item_type", "CustomInquiry"]]

Но здесь второй запрос должен выполняться как -

 TextHistory Load (0.4ms)  SELECT "text_histories".* FROM "text_histories" WHERE "text_histories"."mailed_item_id" = $1 AND "text_histories"."mailed_item_type" = $2  [["mailed_item_id", 197], ["mailed_item_type", "ChildInquiry"]]

Может ли кто-нибудь помочь мне с тем, что обновляется в rails 5 и любым патчем обезьяны, чтобы переопределить это.

1 Ответ

0 голосов
/ 19 сентября 2018

В последней версии ActiveRecord используется базовый класс в ассоциации, поэтому, когда мы используем STI, вместо текущего класса он использует базовый класс. Поэтому для решения этой проблемы вы можете использовать Gem gem "store_base_sti_class".
Он будет использовать текущий класс в ассоциации ActiveRecord.
Вот ссылка на github

https://github.com/appfolio/store_base_sti_class

...