0

我有两个模型,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 都设置为整数。

4

2 回答 2

0

original_account_id 需要一个帐户对象。你不能设置一个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
于 2013-08-23T14:06:11.777 回答
0

我不知道你为什么要命名你的协会account_id,而不仅仅是account在你的CreditRecord班级里。这种方法的问题是当您在路线中拥有/将拥有如下嵌套资源时:

resources :accounts do 
  resources :credit_records
end

您将获得一个 URL 模式/accounts/:account_id/credit_records/:id/...,并且您的 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
于 2013-08-23T14:16:51.077 回答