Saving a nested object to a whole collection of objects at once.

Hello, I’m wondering about how to accomplish saving the same nested form on an entire collection of objects that the form is nested under… I’m not finding much when googling around, is this something that is possible with rails?

Thanks for any thoughts!

Could you give more details of what you want to do? Give us an example of
models, associations and what is to be achieved.

Colin

thank you for your reply Colin, here’s what we’re trying to do:

The app has a farm model and each farm has nested plant models, nested under each plant is a feeding model. Say a farm has 16 plants, we’d like to be able to feed all the plants at once and not create a new feeding for each plant but retain the ability to create an inidividual feeding under a specific plant.

currently the new feed method looks like this:

def new
@farm = Farm.find(params[:farm_id])

@plant = Plant.find(params[:plant_id])

@feed = @plant.feeds.new

end

and the create method for feeds:

def create

@farm = Farm.find(params[:farm_id])

@plant = Plant.find(params[:plant_id] )

@feed = @plant.feeds.new(feed_params)

respond_to do |format|

if @feed.save

format.html { redirect_to farm_plant_feeds_path(@farm, @plant, @feeds), notice: ‘feed was successfully created.’ }

format.json { render :show, status: :created, location: farm_plant_feeds_path(@farm, @plant, @feeds)}

else

format.html { render :new }

format.json { render json: @feed.errors, status: :unprocessable_entity }

end

end

end

thank you for your reply Colin, here's what we're trying to do:

The app has a farm model and each farm has nested plant models, nested
under each plant is a feeding model. Say a farm has 16 plants, we'd like to
be able to feed all the plants at once and not create a new feeding for
each plant but retain the ability to create an inidividual feeding under a
specific plant.

currently the new feed method looks like this:
    def new
    @farm = Farm.find(params[:farm_id])
    @plant = Plant.find(params[:plant_id])

Don't do that, you leave open the possibility of fetching the wrong farm.
Use
@farm = @plant.farm
in fact you don't even need @farm, just use @plant.farm when you need it in
the view. Also the same in the create method below.

Back to the question, I don't understand what you mean by "feed all the
plants at once". Do you mean you want to update all the feeds for a plant?
If so then you can do something like
@plant.feeds.each do |feed|
  do something with feed
  feed.save
end

Colin

thanks for the heads up, I’ll change the methods to use the @plant.farm

We’d like to apply the same feeding to all plants in a farm… so maybe something along the lines of: @farm.plants.feed ? We want to be able to feed all the plants in the farm with the same feed(like a saved recipe for a feeding mix), does this make more sense? So if we have a farm with id of 1 and plant’s with id 1-16 belong to that farm, we then want to be able to apply the fame feeding object to all plants in that farm…

thanks for the heads up, I'll change the methods to use the @plant.farm

We'd like to apply the same feeding to all plants in a farm.. so maybe
something along the lines of: @farm.plants.feed ? We want to be able to
feed all the plants in the farm with the same feed(like a saved recipe for
a feeding mix), does this make more sense? So if we have a farm with id of
1 and plant's with id 1-16 belong to that farm, we then want to be able to
apply the fame feeding object to all plants in that farm..

If you have the situation where each plant can have many feed records, but
also one feed record may be associated with many plants then you need a
many to many relationship, so plant has_and_belongs_to_many feeds. See the
rails guide on activerecord associations for how that works.

Colin