对于模糊的标题感到抱歉,但我不知道如何在一行中提出问题:)
我有一个嵌套项目组的订单,它再次具有嵌套项目。用户指定他希望在每个项目组中拥有的项目数量。我想在创建订单本身时在订单控制器的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
答案 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
。