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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

286閲覧

掲載期間が過ぎたら自動削除されるようにしたいです。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2022/08/06 15:46

・質問したい点
掲載したものに掲載期間を登録できるようにしました。
そこから掲載期間が過ぎたら自動で削除されるようにしたいのですが、controllerからifを使って自動削除させることはできるのでしょうか?

・plan.rb (モデル)

class Plan < ApplicationRecord belongs_to :user validates :title, presence: true, length: { maximum: 50 } validates :detail, presence: true, length: { maximum: 5000 } validates :start_on, presence: true validates :end_on, presence: true end

・plans_controller(コントローラー)

class PlansController < ApplicationController before_action :require_user_logged_in def new @plan = Plan.new if @plan.user == current_user redirect_to '/' end end def create @plan = current_user.plans.build(plan_params) if @plan.save flash[:success] = '企画掲載を設定しました' redirect_to root_url else @pagy, @plans = pagy(current_user.plans.order(id: :desc)) flash.now[:danger] = '企画掲載に失敗しました' render 'toppages/index' end end def destroy @plan.destroy flash[:success] = '掲載を削除しました。' redirect_back(fallback_location: root_path) end private def plan_params params .require(:plan) .permit(:content) end def correct_user @plan = current_user.plans.find_by(id: params[:id]) unless @plan redirect_to root_url end end end

↑このコントローラーに下記のコードを追加してみようと思うのですが、この記述は意味がないですか?

def self.plan_destroy @date = Date.today @plan = Plan.all if plan.end_on < date @plan.destroy end end

この上記の記述で掲載期間後に自動削除されますでしょうか。
ご意見を頂けると幸いです。

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

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

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

回答2

1

ベストアンサー

該当するものを探し出して削除する という機能は1行です。

問題はそれをいつどの様に召喚するか、です。

一番簡単なのは kaniclub さんの回答のようになにかのアクションにくっつける。
この方法は実装は簡単ですが、indexが呼ばれるたびに実行される。無駄が増えます。
この方法を採る場合は 「関係画面(Plan参照)に行くには必ず通るが、頻度がすくない」actionを選ぶのが良いでしょう。
例えば、ユーザのlogin

バッチといって定期的に裏で動かす仕組みで起動する 方法もあります。忙しいサイトではこちらが良いかも。
興味あれば whenever で検索。

なお、削除すべきPlanが沢山ある場合、eachで回すとDBの負荷が上がります。
Plan.where('end_on < ?', Date.today).destroy_all
が良いでしょう。

投稿2022/08/06 23:48

winterboum

総合スコア23148

退会済みユーザー👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/08/09 03:06

回答していただきありがとうございます!

1

似たような機能を付けたことがあるので、当時はこのような感じで実装したと思います。
参考になれば幸いです

実際には動かしていないので、エラーチェックなどは出来ていません。

・plans_controller(コントローラー)

ruby

1before_action :plan_destroy, only: [:show, :index] 2. 3. 4. 5. 6 7def plan_destroy 8 Plan.where('end_on < ?', Date.today).each do |plan| 9 plan.destroy 10 end 11end

投稿2022/08/06 21:21

編集2022/08/06 21:26
kaniclub

総合スコア22

退会済みユーザー👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/08/09 03:06

回答していただき、ありがとうございます!

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.69%

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

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

質問する

同じタグがついた質問を見る

Ruby

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

Ruby on Rails

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