Rails 3, как добавить связанную запись после создания первичной записи (Books, Auto Add BookCharacter)

Rails новичок... пытается понять, как правильно делать вещи...

В моем приложении пользователи могут создать книгу (у меня это работает)

Я хочу, чтобы, когда пользователь создает книгу, в таблицу BookCharacters добавляется запись, что-то вроде (id, book.id, user.id, characterdescription.string.)

Когда книга создана, пользователь, который ее создал, должен автоматически добавляться в качестве первого BookCharacter. После этого пользователь может вручную добавить / отредактировать столько BookCharacters, сколько он хочет. Но изначально я хочу, чтобы они добавлялись автоматически по умолчанию.

Итак, в моем контроллере книги у меня есть:

def create
 @book = Book.new(params[:book])
 respond_to do |format|
  if @book.save
....

С Rails, практикуется ли добавлять такую ​​логику после сохранения книги? Что-то вроде

Book.create( :creator => current_user.id)

Я ценю помощь

2 ответа

Решение

Важная вещь для понимания - это соглашение, по которому Rails реализует отношения с помощью ActiveRecord. Книга имеет много символов, и каждый персонаж принадлежит книге, поэтому:

class Book < ActiveRecordBase
  has_many :characters
end

class Character < ActiveRecordBase
  belongs_to :book
end

Rails теперь предполагает, что characters таблица будет иметь внешний ключ book_id, который относится к books Таблица. Чтобы создать персонажа, принадлежащего книге:

@book = Book.new(:name=>"Book name")
@character = @book.characters.build(:name=>"Character name")

Теперь когда @book сохраняется (при условии, что оба @book а также @character действительны), строка будет создана в обоих books и characters таблицы, со строкой символов, связанной через book_id,

Чтобы показать, что персонаж также принадлежит пользователю, вы можете добавить это отношение к модели персонажа:

class Character < ActiveRecordBase
  belongs_to :book
  belongs_to :user
end

Таким образом Rails теперь ожидает characters также иметь внешний ключ под названием user_id, который указывает на users стол (который также нуждается в User модель). Чтобы указать пользователя при создании персонажа:

@book = Book.new(:name=>"Book name")
@character = @book.characters.build(:name=>"Character name",:user=>current_user)

Вы также можете назначить внешний ключ, вызвав соответствующий метод объекта:

@character.user = current_user

Все это работает, потому что оно следует соглашениям Rails для именования моделей и таблиц. Вы можете отказаться от этих соглашений, но вам будет труднее изучать Rails, если вы это сделаете.

Я предпочитаю что-то вроде (если пользователь has_many Book):

def create
 @book = current_user.books.new(params[:book])
 respond_to do |format|
  if @book.save
  …
Другие вопросы по тегам