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

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

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

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

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

Итак, в моем контроллере Book есть:

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

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

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

Я ценю помощь

Ответы [ 2 ]

19 голосов
/ 18 сентября 2010

Важная вещь, которую нужно понять, - это соглашение, по которому 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, если вы это сделаете.

0 голосов
/ 18 сентября 2010

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

def create
 @book = current_user.books.new(params[:book])
 respond_to do |format|
  if @book.save
  …
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...