Collection_xy for has_one的便利性?

时间:2018-03-31 22:50:42

标签: ruby ruby-on-rails-5.1

我有Accounts模型,其中包含许多CreditCards并且有一个BillingInfo

CreditCards控制器中,我在CollectionProxy

的帮助下初始化
class CreditCardsController < ApplicationController
  def create
    credit_card = current_account.credit_cards.new(credit_card_params)

    ...
  end
end

但是,这不适用于has_one关联:

class BillingInfosController < ApplicationController
  def create
    billing_info = current_account.billing_info.new(billing_info_params)

    ...
  end
end

原因是;在billing_info上调用current_account确实会返回nil而不是空CollectionProxy,这会导致在new上发送nil并与NoMethodError一起存在

有没有办法使用CollectionProxy或类似的东西继续使用

current_account.billing_info.new(billing_info_params)

而不是

BillingInfo.new(billing_info_params.merge(account_id: current_account.id))

初始化?提前谢谢!

2 个答案:

答案 0 :(得分:1)

您应该可以使用current_account.build_billing_infocurrent_account.create_billing_info这些是has_one关联添加的方法。

  

初始化新的has_onebelongs_to关联时,必须使用build_前缀来构建关联,而不是association.build方法用于{has_many 1}}或has_and_belongs_to_many个关联。要创建一个,请使用create_前缀。

有关这些方法的更多信息以及活动记录为您添加的其他方法,请参阅has_one association reference

答案 1 :(得分:0)

一个解决方案是确保每个帐户has_one billing_info 您可以使用vector<string> foo { sregex_token_iterator(cbegin(text), cend(text), re, 1), sregex_token_iterator() } 回调来创建帐户的billing_info

另一个是先获取billing_info after_create