【问题标题】:Convenience of CollectionProxy for has_one?has_one 的 CollectionProxy 的便利性?
【发布时间】:2018-03-31 22:50:42
【问题描述】:

我有一个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

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

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

current_account.billing_info.new(billing_info_params)

而不是类似的东西

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

初始化?提前致谢!

【问题讨论】:

  • 我觉得你太努力了。 Rails 内置了此功能,因此您可以在 CreditCardsController 中完成所有这些操作。阅读this 看看是否有帮助。

标签: ruby ruby-on-rails-5.1


【解决方案1】:

您应该能够使用current_account.build_billing_infocurrent_account.create_billing_info,它们是has_one 关联添加的方法。

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

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

【讨论】:

    【解决方案2】:

    一个解决方案是确保每个帐户都有_one billing_info 您可以使用after_create 回调来创建帐户的billing_info

    另一个是先获取 billing_info billing_info = current_account.billing_info || current_account.build_billing_info billing_info.assign_attributes(billing_info_params)

    【讨论】:

    • 不是after_ & before_ ActiveRecord::Callbacks 的忠实粉丝,但感谢您的建议。 :)
    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多