Как сохранить множество объектов has_many_through одновременно в Rails? - PullRequest
3 голосов
/ 07 марта 2011

У меня есть две модели, связанные следующим образом.

USERS
has_many :celebrations
has_many :boards, :through => :celebrations

BOARDS
has_many :celebrations
has_many :users, :through => :celebrations


CELEBRATIONS
:belongs_to :user
:belongs_to :board

В моем контроллере я хочу создать объекты из данных формы.Я делаю это следующим образом:

  @user = User.new(params[:user])
  @board = Board.new(params[:board])
if @user.save & @board.save    
   @user.celebrations.create(:board_id => @board,:role => "MANAGER")
   redirect_to :action => some_action
end

Поскольку модели объединяются посредством сквозного доступа, существует ли способ сохранить их за один раз, а затем создать сообщения об ошибках за один раз, чтобы они отображались в формев то же время?

Ответы [ 2 ]

4 голосов
/ 07 марта 2011

Это будет делать

@user = User.new(params[:user])
@user.boards << @board
@user.save

Это сохранит объект пользователя и объекты доски, связанные с одной и той же командой @user.save.Он также создаст промежуточную запись празднования с сохраненными user_id и board_id, но в вашем случае это может оказаться бесполезным, так как вам нужно установить значения других столбцов таблицы празднований

2 голосов
/ 07 марта 2011

Ваш метод выглядит довольно стандартно для меня. Чтобы ответить на ваш вопрос ...

При работе с ассоциацией оператор << в основном совпадает с методом create, за исключением:

  • << использует транзакцию. create нет.
  • << запускает обратные вызовы: before_add и: after_add. create нет.
  • << возвращает прокси ассоциации (по сути, набор объектов), если успешно, false не успешно. create возвращает новый экземпляр, который был создан.

Использование оператора << в вашем случае не принесет вам много пользы, поскольку у вас все равно будет несколько транзакций. Если вы хотите, чтобы все вставки / обновления базы данных в вашем действии были атомарными, вы можете заключить это действие в транзакцию. См. Rails API для деталей: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

...