ActiveRecord在保存模型之前验证范围内的关联?

时间:2013-02-10 18:41:11

标签: ruby-on-rails ruby-on-rails-3 activerecord associations

我正在撰写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的唯一性,直到 保存Order之后。但是,如果我的LineItem无法验证,那么我已经在系统中保存了一份我不想要的订单。

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

1 个答案:

答案 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回调来验证新项目的名称唯一性。修复错误后,您就可以删除此回调。