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

标签 mysql ruby-on-rails-3.2 single-table-inheritance sti

我有一个 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/

相关文章:

php访问远程数据库

ruby-on-rails - rails : Custom text for rails form_for label

ruby-on-rails - ActiveRecord 模型的保留名称

ruby-on-rails-3 - 命名空间类的单表继承和 'type'值

PHP MySql 数组插入表

mysql - 如何使用子查询计算同一个表中的特定字段的数量并为这些子查询分配特定名称以获取数据

ruby-on-rails - 为什么我在 number_to_currency 中的语言环境设置不起作用?

ruby-on-rails - has_many 具有多级层次结构和单表继承

java - Hibernate HT_ 临时表 ON JOINED 继承,从 Hibernate 3.4.0.GA 迁移到 5.1

php - 使用php删除sql数据库中的行