У меня есть модель STI, в которой подклассы каждого из них используют разные проверки. По умолчанию в Rails будут выполняться проверки исходного типа во время выполнения, поэтому я пытаюсь использовать «становится» для принудительного подтверждения нового типа.Однонаправленное наследование и изменение типа не сохраняются
Мой код выглядит следующим образом:
payment_processor = PaymentProcessor.where(:account_id => self.id).first_or_initialize
new_gateway = "PaymentProcessors::#{gateway_type.classify}".constantize
payment_processor = payment_processor.becomes(new_gateway)
payment_processor.type = new_gateway
payment_processor.assign_attributes(attributes)
payment_processor.save!
Однако это не спасает, потому что MySQl генерируется во время сохранения ищет нового типа. Так, например, если мой первоначальный gateway_type является «AuthorizeNet» и я меняю на «PayPal», то MySQL является:
UPDATE `payment_processors` SET `type` = 'PaymentProcessors::PayPal', `updated_at` = '2015-11-07 11:53:53' WHERE `payment_processors`.`type` IN ('PaymentProcessors::PayPal') AND `payment_processors`.`id` = 232
Но следует искать оригинальный тип, Auth.net как это:
UPDATE `payment_processors` SET `type` = 'PaymentProcessors::PayPal', `updated_at` = '2015-11-07 11:53:53' WHERE `payment_processors`.`type` IN ('PaymentProcessors::AuthorizeNet') AND `payment_processors`.`id` = 232
Любые идеи о том, как пропустить предложение «where», чтобы просто обновить идентификатор платежного_процессора?