首页 > 解决方案 > Rails:由于重复的属性名称,assign_attributes 失败

问题描述

我有一个与数据库表orders相关的Order模型,其中包含pay_type:integer列,但后来添加了pay_types表,并且Order模型被修改为如下所示:

class Order < ApplicationRecord
  belongs_to :pay_type
  ...
end

这意味着现在Order模型有 2 个名为pay_type的属性。我仍然可以使用read_attribute方法读取与表列相关的内容:

order = Order.first
order.pay_type # nil
order.read_attribute(:pay_type) # 1

但是当我尝试使用这样的assign_attributes方法分配给后者时:

order.assign_attributes(pay_type: 2)

我收到以下错误:

ActiveRecord::AssociationTypeMismatch (PayType(#14340) expected, got 2 which is an instance of Integer(#5000))

我知道我可以像这样更改Order模型上pay_type属性的名称:

belongs_to pay_type_something, class_name: :PayType

并且重复将消失,但我只想知道:有没有办法在不更改任何名称的情况下为我的第一个pay_type属性赋值?

标签: ruby-on-railsruby

解决方案


你可以试试[]=write_attribute

order[:pay_type] = 2 # or
order.write_attribute(:pay_type, 2)

但是这些方法受到保护,这限制了它们的用例。正如您已经注意到的那样,最好重命名属性或关联。


推荐阅读