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
…