【问题标题】:Ruby on rails - nested attributes: How to do a find or create of the nested modelRuby on rails - 嵌套属性:如何查找或创建嵌套模型
【发布时间】:2010-01-06 16:25:28
【问题描述】:

我有一个带有嵌套 Customer 模型的 Bill 模型。 Customer 模型有一个带有唯一性验证的电话号码。 在创建账单时,我想根据电话号码获取现有记录,或者如果不存在则创建一个新记录。 我应该如何以RESTful 的方式进行操作?

【问题讨论】:

  • 在进一步的研究和谷歌搜索中,我发现我可以向 customer_attributes 添加一个 :id 键,并且 rails 会更新记录而不是创建新记录。换句话说,我必须发出一个 customer_attributes[:id] = find_by_phone(customer_attributes[:phone]).id 我不明白的(还)是模型生命周期中的哪个钩子(之前/之后,验证/save) 甚至是我应该使用哪个模型(客户/账单)。在这种情况下,解决方案似乎相当简单,但在深度嵌套的字段中变得复杂。

标签: ruby-on-rails rest nested-attributes


【解决方案1】:

您将使用 find_or_create_by 方法,在您的情况下看起来像这样:

fetchedRecord = Bill.find_or_create_by_phone_number(customer.phone_number)

【讨论】:

    【解决方案2】:

    您可以查看 find_or_create 或 find_or_create_by 方法(它们是动态创建的)。我想,稍微用谷歌搜索一下应该可以帮助您完成剩下的工作。

    【讨论】:

      【解决方案3】:

      这些答案似乎不是您要问的。

      忘记 Rails,我的问题是,创建可能已经存在的资源的 RESTful 方式是什么?您是否应该 POST 到资源(列表)URL,然后如果资源已创建则期望 HTTP 状态代码为 201,如果资源已存在则期望 HTTP 状态代码为 200?

      似乎这应该在某个地方的标准中详细说明。

      顺便说一句,这就是我的处理方式——使用状态码。

      【讨论】:

        【解决方案4】:

        我把我的放在关联回调before_add

        【讨论】:

        • 请将 cmets 放入 cmets 部分。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多