我正在撰写API,并且有两个模型将作为一篇文章的一部分创建,即Order
和LineItem
。我的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
的唯一性,直到 保存Order
之后。但是,如果我的LineItem
无法验证,那么我已经在系统中保存了一份我不想要的订单。
处理这种情况的正确方法是什么?
答案 0 :(得分: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回调来验证新项目的名称唯一性。修复错误后,您就可以删除此回调。