Remove object from has_many but don't delete the original record in Rails?
Asked Answered
B

1

38

I have this:

Post.paragraphs << new_paragraph

And I need to remove paragraph by id = 3, so the following deletes the record completely:

Post.paragraphs.find(paragraph_id).destroy
# or
Post.paragraphs.find(paragraph_id).delete

I just need to remove a paragraph from has_many association. I tried to use delete and destroy. Both methods completely delete records from the associated tables. How can I just remove them from the "container"?

Bister answered 4/9, 2014 at 8:12 Comment(1)
Please note, that I forgot to remove the dependent: destroy. Anyway the answers below are great.Bister
B
74

You should not use the delete method on the Paragraphobject, but instead use the delete method of paragraphs relation, like this:

post.paragraphs.delete(Paragraph.find(paragraph_id))
Bromate answered 4/9, 2014 at 8:20 Comment(5)
you can omit Paragraph and use post.paragraphs.delete(paragraph_id). You can pass Fixnum or String values, it finds the records responding to the id and executes delete on them.Faubourg
@Зелёный is there a way to make it work with an array of ids?Bister
@Bister pass splat(*) array to delete method. Something like: array = [1,2,3,4] and now post.paragraphs.delete(*array) read about itFaubourg
Doesn't this actually perform delete on the record, removing it from the database? The OP is asking how to remove the item from the array, not delete from the database.Extine
The record is not removed from the database, unless dependant: :destroy has been set in the has_many relationBromate

© 2022 - 2024 — McMap. All rights reserved.