質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

4991閲覧

Railsで削除と更新を同時に行いたい

kenny_sayama

総合スコア1036

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2016/01/06 14:32

現在作成中のアプリケーションで、userが退会(destory)処理を行ったら関連する、記事(article)の公開非公開(publish_statusというカラムで0なら非公開、1は公開としています)を変更するという処理をしたいと思っています。

Ruby

1def destroy 2 @user.destroy 3 @user_articles = Article.where(:user_id => @user.id) 4 if @user.destroy 5 @user_articles.each do |user_article| 6 if user_article.publish_status = 1 //publish_statusが1で公開の場合は非公開に 7 user_article.publish_status = 0 8 user_article.update //記事の公開ステータスを更新したい 9 end 10end

このような感じに処理したいと思っています。
ユーザーが退会処理を行ったら、そのユーザーに関連する全記事の公開ステータス(publish_status)を非公開(0)にしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ruby

1class User < ActiveRecord::Base 2 has_many :articles 3 before_destroy :unpublish 4 5 private 6 def unpublish 7 Article.where("user_id = ?", self.id).update_all("publish_status = 0") 8 end 9end

上記のようにしておくと@user.destroyでuserの削除前にuserに関連付けられた記事のpublish_statusが変更されます。

Ruby

12.1.7 :008 > Article.all 2 Article Load (0.4ms) SELECT "articles".* FROM "articles" 3 => #<ActiveRecord::Relation [#<Article id: 1, user_id: 2, title: "title 1", created_at: "2016-01-07 11:39:36", updated_at: "2016-01-07 11:50:54", publish_status: 1>, #<Article id: 2, user_id: 2, title: "title 2", created_at: "2016-01-07 11:39:36", updated_at: "2016-01-07 11:50:54", publish_status: 1>]> 42.1.7 :009 > @user.destroy 5 (0.1ms) begin transaction 6 SQL (0.5ms) UPDATE "articles" SET publish_status = 0 WHERE (user_id = 2) 7 SQL (0.2ms) DELETE FROM "users" WHERE "users"."id" = ? [["id", 2]] 8 (2.1ms) commit transaction 9 => #<User id: 2, name: "me", created_at: "2016-01-07 11:50:54", updated_at: "2016-01-07 11:50:54"> 102.1.7 :010 > Article.all 11 Article Load (0.4ms) SELECT "articles".* FROM "articles" 12 => #<ActiveRecord::Relation [#<Article id: 1, user_id: 2, title: "title 1", created_at: "2016-01-07 11:39:36", updated_at: "2016-01-07 11:50:54", publish_status: 0>, #<Article id: 2, user_id: 2, title: "title 2", created_at: "2016-01-07 11:39:36", updated_at: "2016-01-07 11:50:54", publish_status: 0>]>

投稿2016/01/07 11:56

jinco

総合スコア432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Userのbefore_destroyに、関連するArticleの公開ステータスを変更する処理を書く方法が考えられます。
記事がたくさんある場合はeachで1つ1つ更新すると処理が遅くなってしまう可能性があるので、一気にやってしまったほうがよいと思います。

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
http://www.techscore.com/blog/2012/12/25/rails%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%BE%E3%81%A8%E3%82%81/

投稿2016/01/06 22:16

jinco

総合スコア432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenny_sayama

2016/01/07 06:19

回答ありがとうございます! before_destroy知りませんでした。before_destroyでアカウント削除のタイミングでどのように書いたら、記事の公開ステータスを変更出来るのかいまいちわからないのですが、eachを使わずにできるのでしょうか?
kenny_sayama

2016/01/12 10:11

出来ましたありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問