获取auto_increment值,使用build?

时间:2011-01-22 00:17:18

标签: ruby-on-rails

在我的用户注册例程中,我有以下代码:

@user = User.new(attribs)  

@user.build_inventory(:max_slots => 10) # create the user inventory, starting with 10 slots

success = @user && @user.save
if success && @user.errors.empty?

这非常适合创建库存和绑定到该库存的用户。但是,现在我想在每次注册时添加一个新的inventory_item。我试过像:

@user = User.new(attribs)  

inventory = @user.build_inventory(:max_slots => 10) # create the user inventory, starting with 10 slots
InventoryItem.create(:inventory_id => inventory.id, :game_item => GameItem.find_by_name('Fist'), :is_equipped => 1)

我认为它不会起作用(因为库存不是在inventory_item之前构建的,当然也没有。所以这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

自动将商品添加到广告资源的最佳方法是在广告资源模型中执行此操作。在那里,您可以添加after_create方法,该方法将在每次创建清单时运行。这样,您就可以从模型中删除这个增加的复杂层,而不必担心库存ID。

class Inventory < ActiveRecord::Base
  # other associations
  has_many :inventory_items

  after_create :create_starting_items

  protected
    def create_starting_items
      inventory_items.create do |item|
        item.game_item   = GameItem.find_by_name('Fist')
        item.is_equipped = true # This should likely be a boolean
      end
    end
end

您可以将此功能扩展到用户模型,并将库存创建为after_create,允许控制器仅创建用户并让模型处理相关的库存和物料。 / p>