我有两个模型,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