在将对象保存到db之前创建对象和引用

时间:2010-05-07 11:23:48

标签: ruby-on-rails model nested

对于模糊的标题感到抱歉,但我不知道如何在一行中提出问题:)

我有一个嵌套项目组的订单,它再次具有嵌套项目。用户指定他希望在每个项目组中拥有的项目数量。我想在创建订单本身时在订单控制器的create方法中创建这些项目。

我有点问题。首先,我如何设置项目的引用,或者更好的是,将项目放入@order对象,以便在保存@order时保存它们?这些项目正在代码中存储在数据库中,但未设置引用,因为订单尚未存储在数据库中,因此它还没有ID。

其次,我不确定我是否使用正确的方法从我的itemgroup获取id。

@order = Order.new(params[:order])

@order.itemgroups.each do |f|
  f.amount.times do
    @item = Item.new()
    @item.itemgroup_id = f.id
    @item.save
    end
end

2 个答案:

答案 0 :(得分:1)

我必须在这里做一些假设,因为根据您的描述,您的数据模型非常不寻常。特别是“Item”类似乎没有用处。

我认为它看起来像这样:

class Order < ActiveRecord::Base
   has_many :itemgroups
end

class Itemgroup < ActiveRecord::Base
   belongs_to :order
   has_many :items
end

class Item < ActiveRecord::Base
  belongs_to :itemgroup
end

在这种情况下,您可以做的最简单的更改是将循环更改为:

 @order.itemgroups.each do |f|
   f.amount.times do
     item = itemgroup.items.build() #this links the fk before it exists
     #this is where I assume you are doing something with the item
     #otherwise the item class seems pointless
  end
 end
 @order.save #saves dependent objects as well

答案 1 :(得分:0)

创建订单,但将整个内容放入 transaction 。这样,如果订单无法存储项目,ActiveRecord将删除该订单。

此外,除非项目不同(例如颜色,大小或其他),否则您应该在其中存储字段amount