Selective delete from join tables

17 views
Skip to first unread message

Dave Castellano

unread,
May 31, 2013, 9:50:13 AM5/31/13
to rubyonra...@googlegroups.com
Hi,

I'm learning rails and have run into what for me is a difficult problem.
I have the following associations with a galleries_pictures and a
pictures_questions join table:

class Picture < ActiveRecord::Base
has_and_belongs_to_many :questions
has_and_belongs_to_many :galleries

class Question < ActiveRecord::Base
has_and_belongs_to_many :pictures

class Gallery < ActiveRecord::Base
has_and_belongs_to_many :pictures

In the edit question view, a question and its associated picture(s) can
be edited. My problem is, I cannot figure out how to delete the picture
in the question and at the same time not delete it from the gallery ie
delete the pictures_questions association but not the
galleries_pictures association.

The action called from the view deletes the row in both join tables:
def destroy
@picture = Picture.find(params[:id])
@picture.destroy

Thanks!

--
Posted via http://www.ruby-forum.com/.

Hassan Schroeder

unread,
May 31, 2013, 11:22:12 AM5/31/13
to rubyonra...@googlegroups.com
On Fri, May 31, 2013 at 6:50 AM, Dave Castellano <li...@ruby-forum.com> wrote:

> My problem is, I cannot figure out how to delete the picture
> in the question and at the same time not delete it from the gallery ie
> delete the pictures_questions association but not the
> galleries_pictures association.

http://guides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference

--
Hassan Schroeder ------------------------ hassan.s...@gmail.com
http://about.me/hassanschroeder
twitter: @hassan

Robert Walker

unread,
May 31, 2013, 12:09:37 PM5/31/13
to rubyonra...@googlegroups.com
Dave Castellano wrote in post #1110796:
Here you are destroying the picture object so naturally Rails will
manage the associations automatically. What you want to do instead is
to delete the association not the actual picture object.

There are a couple of ways to do this. But, you do not wan to use the
destroy action on pictures_controller. That action should be used to
destroy pictures not associations.

Option 1—Expose the join model and manage the association with standard
REST destroy action on the association model:

class Picture < ActiveRecord::Base
has_many :question_pictures
has_many :questions, :through => :question_pictures
end

class Question < ActiveRecord::Base
has_many :question_pictures
has_many :pictures, :through => :question_pictures
end

class QuestionPicture < ActiveRecord::Base
belongs_to :question
belongs_to :picture
end

question_pictures_controller
-----------------
def destroy
question_picture = QuestionPicture.find(params[:id])
question_picture.destroy
end

Option 2—Add an additional RESTful action to questions_controller

config/routes.rb
-------------------
resources :questions do
  delete 'remove_picture', :on => :member
end

questions_controller.rb
-------------------
def remove_picture
question = Question.find(:id)
picture = question.pictures.find(params[:picture_id])
question.pictures.delete(picture)
end

Example URL:
DELETE: http://example.com/galleries/1/remove_picture/?picture_id=1

P.S. None of this code has been tested. Just wrote it by memory.

Dave Castellano

unread,
May 31, 2013, 10:16:33 PM5/31/13
to rubyonra...@googlegroups.com
>
> P.S. None of this code has been tested. Just wrote it by memory.

Thank you. I get it. It worked well with a couple of small tweaks.
...wish I could do that from memory :-)

Thanks,
Dave
Reply all
Reply to author
Forward
0 new messages