1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-07 17:18:02 +00:00

Add Mark For Destruction as a rails til

This commit is contained in:
jbranchaud
2017-01-22 12:17:42 -06:00
parent 2f054115c9
commit 7a775dec23
2 changed files with 44 additions and 1 deletions

View File

@@ -0,0 +1,42 @@
# Mark For Destruction
Do you have some complicated logic or criteria for deleting associated
records? [ActiveRecord's
`#mark_for_destruction`](http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html#method-i-mark_for_destruction) may come in handy.
Let's say we have _users_ who author _articles_. We want to delete some of
the user's articles based on some criteria -- those articles that have odd
`id`s.
```ruby
> user = User.first
#=> #<User...>
> user.articles.each { |a| a.mark_for_destruction if a.id.odd? }
#=> [#<Article...>, ...]
> user.articles.find(1).marked_for_destruction?
#=> true
> user.articles.find(2).marked_for_destruction?
#=> false
```
We've marked our articles for destruction and confirmed as much with the
[`#marked_for_destruction?`](http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html#method-i-marked_for_destruction-3F) method. Now, to go through with the destruction, we just have to save the parent record -- the user.
```ruby
> user.save
(0.2ms) BEGIN
User Exists (0.8ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'person1@example.com' AND "users"."id" != 1) LIMIT 1
SQL (3.0ms) DELETE FROM "articles" WHERE "articles"."id" = $1 [["id", 1]]
SQL (0.2ms) DELETE FROM "articles" WHERE "articles"."id" = $1 [["id", 3]]
(2.1ms) COMMIT
=> true
```
Note: the parent record must have `autosave: true` declared on the
association.
```ruby
class User < ActiveRecord::Base
has_many :articles, autosave: true
end
```