Rails-将一个模型与另一个模型的多个实例关联时发生AssociationTypeMismatch错误



我有两个模型,Accounts和CreditRecords。一个账户可以有许多属于它的信用记录。然而,账户也可以将信用记录交易到其他账户,我想跟踪谁是当前账户所有者,谁是原始所有者。

class Account < ActiveRecord::Base
has_many :credit_records
class CreditRecord < ActiveRecord::Base
belongs_to :original_owner_id, :class_name => "Account"
belongs_to :account_id, :class_name => "Account"

当我尝试将CreditRecord.account_id设置为1时,它会很好地更新。但是,如果我试图将CreditRecord.original_owner_id设置为3,我会得到以下错误:

ActiveRecord::AssociationTypeMismatch: Account(#70154465182260) expected, got Fixnum(#70154423875840)

account_id和original_owner_id都设置为整数。

original_account_id需要一个account对象。不能设置id。

credit_record.original_owner = account
credit_record.account = account

credit_record.account_id = account.id

请将您的关联重命名为以下

class CreditRecord < ActiveRecord::Base
belongs_to :original_owner, :foreign_key => "account_id", :class_name => "Account"
belongs_to :account

我不知道为什么要在CreditRecord类中将关联命名为account_id,而不仅仅是account。这种方法的问题是,当你的路线中有/将有嵌套的资源时,比如:

resources :accounts do 
  resources :credit_records
end

你会得到一个/accounts/:account_id/credit_records/:id/...的URL模式,你的params散列中会有account_id参数。

建议按照@vimsha在回答中的建议更新您的关联。

class CreditRecord < ActiveRecord::Base
  belongs_to :original_owner, :class_name => Account, :foreign_key => 'account_id'
  belongs_to :account, :class_name => Account
end

这将允许您通过信用记录对象分配帐户的id属性,如:

# Set account's id
credit_record.account.id = 1
# Set original_owner's id
credit_record.original_owner.id = 2

最新更新