0

我正在编写一个 API,并且有两个模型将作为一篇文章的一部分创建,它们是OrderLineItem. 我的 API 需要(理想情况下)这种格式的数据:

{
    "name": "Test Name",
    "date": "2013/01/01",
    "items": [{
        "name": "Item One",
        "quantity": 10
    }, {
        "name": "Item Two",
        "quantity": 30
    }]
}

在上面的示例中,“name”和“date”是我的Order模型的属性,“items”数组中的每个条目都是一个LineItem. 我的两个模型定义如下:

class Order < ActiveRecord::Base
    has_many :line_items
end

class LineItem < ActiveRecord::Base
    belongs_to :order

    validates :name, :uniqueness => {:scope => :order_id }
end

因此,每个订单项对于订单必须是唯一的。我收到此 POST 请求来构建我的项目时,似乎LineItems在保存我的. 但是,如果我的 s 未能验证,那么我已经在我的系统中保存了一个我不想要的订单。OrderLineItem

处理这种情况的正确方法是什么?

4

1 回答 1

1

听起来您正在寻找的是在 Order.valid 时要求验证行项目?叫做。您可以使用 validates_associated 执行此操作:

class Order < ActiveRecord::Base
  has_many :line_items
  validates_associated :line_items
end

这也将导致对行项目的验证也被调用。有关更多详细信息,请参阅:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

编辑

正如评论中所指出的,似乎当前打开的错误阻止了验证失败(尽管重复的 line_item 不会保存到磁盘)。看:

为了解决这个错误,您可能需要创建一个 before_validation 回调来验证新项目的名称唯一性。修复错误后,您就可以删除此回调。

于 2013-02-10T18:48:28.417 回答