If you have a m:n association Post.has n, :post_labels Post.has n, :labels, :through => :post_labels
# safe - destroy intermediate resource after loading it (with validation and callbacks) post.post_labels.get(1).destroy # unsafe - destroy intermediate resource directly without loading it and invoking callbacks post.post_labels.get(1).destroy! If you have a 1:n association Post.has(n, :labels) # safe - destroy target resource after loading it (with validation and callbacks) post.labels.get(1).destroy # unsafe - destroy target resource directly without loading it and invoking callbacks post.post_labels.get(1).destroy! The key here is that the #destroy and #destroy! methods are available both on Resource and on Collection. If you want to destroy a single resource, you just call #destroy on it, if you need to destroy a single resource inside a collection you do post.labels.get(1).destroy, again calling #destroy on a Resource that you first need to get to. If you want to destroy a complete collection, do post.labels.destroy. This will destroy all labels associated with post. If you only want to destroy some elements inside a collection, do post.labels(:color => 'blue').destroy All you need to do is make sure you either call #destroy or #destroy! on a Resource, or on a Collection. A "belongs_to" relationship gives you "almost" a Resource (it's a proxy internally), a "has" relationship gives you a Collection, as will any call to #all, with or without conditions. HTH cheers snusnu On Sat, Mar 13, 2010 at 01:54, Tony Mann <[email protected]> wrote: > Or use the model LabelsPosts (or some name similar to this) and delete the > join record. > ..tony.. > > On Fri, Mar 12, 2010 at 2:51 PM, arbales <[email protected]> wrote: >> >> Are the posts and labels associated through a join table? >> >> class Post >> ... >> has n, :labelings >> has n, :labels, :through => :labelings >> end >> >> label_to_remove = Label.get(id) >> some_post.labelings.first(:label => label_to_remove).destroy >> >> >> >> >> >> On Mar 11, 12:18 pm, bl <[email protected]> wrote: >> > I can't find this anywhere. >> > >> > Let's say you're making the classic "blog" style app and you have >> > Posts with labels. Well I know you can do: >> > >> > some_post.labels << some_label >> > some_post.save >> > >> > But it seems like you can't do: >> > >> > some_label = Label.get(id) >> > some_post.labels.remove(some_label) >> > some_post.save >> > >> > remove() throws a type error, delete_if doesn't enumerate, etc. >> > >> > I must be missing something here. This would seem to be an essential >> > feature of associations but there's no documentation for it and web >> > searches turn up almost nothing. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "DataMapper" group. >> To post to this group, send email to [email protected]. >> To unsubscribe from this group, send email to >> [email protected]. >> For more options, visit this group at >> http://groups.google.com/group/datamapper?hl=en. >> > > -- > You received this message because you are subscribed to the Google Groups > "DataMapper" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/datamapper?hl=en. > -- You received this message because you are subscribed to the Google Groups "DataMapper" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/datamapper?hl=en.
