Создание многих связанных моделей before_save - PullRequest
1 голос
/ 27 ноября 2011

У меня есть модель User с devise, модель Team, модель Player и модель Trainer. Я хочу, чтобы когда пользователь регистрировался, его связанная команда создавалась вместе со связанным тренером и игроками. Я настроил модели, как показано ниже:

user.rb

has_one :team
has_one :trainer, :through => :team
has_many :players, :through => :team
accepts_nested_attributes_for :team, :allow_destroy => true

before_save :create_team

def create_team
  @team = Team.new(params[:team])
  @team.user = self
  @team.save
end

team.rb

belongs_to :user
has_one :trainer
has_many :players
accepts_nested_attributes_for :trainer, :allow_destroy => true
accepts_nested_attributes_for :player, :allow_destroy => true

trainer.rb и player.rb

belongs_to :team

Я не добавил функции create_trainer и create_player, так как я хочу, чтобы пользователь выбрал их позже в игре. Поэтому они должны быть пустыми при создании пользователя.

Но в процессе регистрации выдается следующая ошибка:

No association found for name `trainer'. Has it been defined yet?

и относится к строке:

accepts_nested_attributes_for :trainer, :allow_destroy => true

в team.rb. Что плохого в том, что пункт «Тренер» еще не определен, если нет подтверждения наличия «Тренера», определенного в модели «Команда»? Я попытался добавить несколько строк в модель Trainer, чтобы установить для атрибутов значения по умолчанию, такие как:

morale.default => (5..12).to_a.sample

но это дало дальнейшие ошибки, так что, вероятно, неправильно. Любые комментарии очень ценятся, особенно если они критикуют основы размышлений здесь, так как я нуб.

1 Ответ

1 голос
/ 29 ноября 2011

Несколько вещей:

Не используйте переменные экземпляра в вашей модели. Чтобы получить доступ к команде в пользовательской модели, просто наберите team или self.team.

Не используйте before_save, поскольку вы не хотите создавать команду каждый раз, когда сохраняете своего пользователя.

Ваш метод create_team должен быть:

after_create :my_create_team

def my_create_team
    create_team #create an empty team
end

Но если данные для новой команды уже присутствуют в форме, когда пользователь регистрируется, тогда группа должна быть автоматически создана, поскольку у вас есть accepts_nested_attributes_for :team.


Я собираюсь ответить на некоторые ваши вопросы в комментариях здесь:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one

Поэтому, когда вы добавляете has_one :team, у вас теперь есть доступ ко всем этим методам (build_team, create_team, team = и т. Д.)

Под "пустым" я просто имел в виду, что если вы просто позвоните create_team без каких-либо атрибутов, это создаст команду "по умолчанию": без имени и т. Д. Но это будет связано с вашим пользователем.

Если вы хотите просто создать «пустую» команду, вы можете просто сделать это, я думаю:

after_create :create_team

Создание собственного метода позволит вам просто передавать параметры по умолчанию.

Но вы, вероятно, добавили проверку в команду, например, проверку наличия ее имени. В любом случае, поскольку у вас есть accepts_nested_attributes_for :team, :allow_destroy => true, он должен автоматически создать команду, если у вас есть обязательные поля для команды пользователя в форме регистрации.

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