получить значение auto_increment со сборкой? - PullRequest
1 голос
/ 22 января 2011

В моей процедуре регистрации пользователя у меня есть этот код:

@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?

Это прекрасно работает при создании инвентаря и привязки пользователя к этому инвентарю.Тем не менее, теперь я хочу добавить новый инвентаризатор в каждую регистрацию.Я попробовал что-то вроде:

@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)

Я думал, что это не будет работать (потому что инвентарь не был создан до инвентаризации, и, конечно, это не так. Какой правильный способ сделать это?

1 Ответ

1 голос
/ 22 января 2011

Лучший способ автоматического добавления предмета в инвентарь - сделать это в модели инвентаря. Там вы можете добавить метод after_create, который будет запускаться при каждом создании инвентаря. Таким образом, вы можете удалить этот дополнительный уровень сложности из вашей модели, и вам не нужно беспокоиться об идентификаторе инвентаря.

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, позволяя контроллеру только создавать пользователя и предлагать модели (ях) заботиться о связанных инвентарях и товарах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...