模型的每个实例都具有另一个模型的一个或多个实例

时间:2014-12-18 15:20:22

标签: ruby-on-rails ruby-on-rails-4

如何表明模型的每个实例都有一个或更多另一个模型的实例。

我总是看到如何使用has_many - belongs_to <指示一对多(模型的每个实例具有或更多其他模型的实例) / p>

典型地

class Order < ActiveRecord::Base
  has_many :line_items 

class LineItem < ActiveRecord::Base
  belongs_to :cart

但对于关系订单----&gt; 1 .. n LineItem ????

3 个答案:

答案 0 :(得分:1)

您仍然会使用has_manybelongs_to。但是,您必须确保父项的实例在没有子项的任何实例的情况下不能存在,反之亦然。您可以通过多种方式完成此操作。从孩子那边:

  1. 首先创建父对象。如果有要分配给
  2. 的父级,则仅创建子实例
  3. 使用嵌套表单
  4. 同时创建两个对象
  5. 使用验证确保孩子在保存之前有父母
  6. 或者来自父方:

    1. 仅在有LineItem分配给它时才创建订单
    2. 创建订单,但在添加LineItems
    3. 之前不要更改其状态
    4. 使用嵌套表单
    5. 同时创建两者

      还有一些场景,但这说明了这一点。这实际上取决于你如何建模对象。

答案 1 :(得分:1)

在LineItem上,添加validates_presence_of :cart_id

在购物车上,将inverse_of :cart添加到has_many声明

官方Rails解决方案:http://guides.rubyonrails.org/active_record_validations.html#presence

答案 2 :(得分:0)

class Cart < ActiveRecord::Base

    has_many :line_items
    validates_presence_of :line_item_id
end

我认为这就是你想要的。购物车应该有1 ... n行项目。