Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails preview update associations without saving to database

I want to preview what the model will look like when saved without currently saving to the database.

I am using @event.attributes = because that assigns but does not save attributes for @event to the database.

However, when I also try to assign the audiences association, Rails inserts new records into the audiences_events join table. Not cool. Is there a way to preview what these new associations will look like without inserting into the join table?

Model

class Event < ActiveRecord::Base
  has_and_belongs_to_many :audiences # And vice versa for the Audience model.
end

Controller

class EventsController < ApplicationController 

  def preview
    @event = Event.find(params[:id])
    @event.attributes = event_params
  end

  private
    def event_params
      params[:event].permit(:name, :start_time, :audiences => [:id, :name]
    end

end

Possible Solutions?

Possible solutions that I thought of, but don't know how to do:

  • Using some sort of method that assigns associations, but does not persist them.
  • disabling all database writes for this one action (I dont know how to do that).
  • Rolling back all database changes at the end of this action

Any help with these would be great!

UPDATE:
After the reading the great answers below, I ended up writing this service class that assigns the non-nested attributes to the Event model, then calls collection.build on each of the nested params. I made a little gist. Happy to receive comments/suggestions.

https://gist.github.com/jameskerr/69cedb2f30c95342f64a

like image 922
James Kerr Avatar asked May 07 '15 19:05

James Kerr


1 Answers

In these docs you have:

When are Objects Saved?

When you assign an object to a has_and_belongs_to_many association, that object is automatically saved (in order to update the join table). If you assign multiple objects in one statement, then they are all saved.

If you want to assign an object to a has_and_belongs_to_many association without saving the object, use the collection.build method.

Here is a good answer for Rails 3 that goes over some of the same issues

Rails 3 has_and_belongs_to_many association: how to assign related objects without saving them to the database

like image 71
george Avatar answered Nov 04 '22 04:11

george