gpt4 book ai didi

mysql - 单表继承和改变类型不会保存

转载 作者:行者123 更新时间:2023-11-29 03:28:13 25 4
gpt4 key购买 nike

我有一个 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 子句”以仅通过 payment_processor ID 更新的任何想法?

最佳答案

我了解到 STI 在尝试更改类型时验证失败。 (阅读更多 http://blog.arkency.com/2013/07/sti )。因此,我通过始终创建一个新的 payment_processor 但在验证失败时恢复旧的来解决问题。这很不优雅,但很管用。

复制原来的 payment_processor 然后删除它:

original = self.payment_processor.destroy
self.payment_processor.destroy

我们没有传递新类型,而是将其从参数中删除,但使用 new_gateway_type 来创建新网关。

new_gateway_type = params[:payment_processor][:gateway_type]
params[:payment_processor].delete(:gateway_type)

例如,如果新网关是“Paypal”,我们将常量化 new_gateway_type 以创建一个新对象,然后更新参数:

payment_processor = "PaymentProcessors::#{new_gateway_type}".constantize.new(:account_id => self.id)
payment_processor.update_attributes(params[:payment_processor)

最后,我们保存新网关。如果这个 new_gateway 的验证失败,我们通过常量化对象模型名称并传入除 type 和 id 之外的新属性来恢复旧的:

begin
payment_processor.save!
rescue ActiveRecord::RecordInvalid => invalid
original.type.constantize.new(original.attributes.except("id", "type")).save
end

关于mysql - 单表继承和改变类型不会保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33585990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com