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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

8701閲覧

[Rails]一定時間が経過したら自動的に、ユーザーの投稿したデータを削除したい

misutaa

総合スコア14

Ruby

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

Ruby on Rails

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

0グッド

6クリップ

投稿2017/02/20 08:14

Twitterのようなユーザーが投稿できるSNSサイトを作っています。
具体的には、Ruby on Rails Tutorialのサンプルアプリケーション完成直後で今から機能を足そうとしている段階です。
ユーザーが投稿してから、一定時間(30分)が経過したら自動的にデータを削除する機能を実装したいです。

いろいろ調べて、wheneverを使って試してみたり、expires_inを使って試してみたりしたのですが、具体的な書き方が分からずどうしても消せません。

wheneverの場合だと、schedule.rbにどのように書けば良いか。
また、その他に方法があれば是非教えてください。

大変お手数ですが、ご回答いただけますと助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

色々書こうかと思いましたが
terateil
ここにまとまっていました。
質問する前に、まずkeywordで調べましょう
一応方針としては
①どうせ、見るときに消えてればいいよねー
ということで、controller側で一覧を見るときに判定して消す
before_actionとかで
②定期的(1分おきとか)に監視してそのとき30分を超えているのを消す
wheneverを利用して

ruby

1every 1.minute do 2 runner: 30分過ぎたのをdeleteするメソッド 3end

③非同期処理を使い30分後に自分自身を削除させる。
active_jobを使って遅延呼び出しをする
Active Jobを使ってみよう

どれがいいかは、システムによりますが、
正直、システムが小規模なうちはどれでも変わりません。

投稿2017/02/20 09:39

moke

総合スコア2241

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

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

misutaa

2017/02/20 09:51

ご回答ありがとうございます! 貼っていただいたリンクを見てはいたのですがわかりませんでした。。。 お手数ですが、「30分過ぎたのをdeleteするメゾット」っていうのは具体的にどう書けばいいのですか? もし宜しければ例などをいただければ嬉ありがたいです。 何度も質問申し訳ありません。 何度も調べてもわからなかったことなので是非教えてください。 宜しくお願い致します。
moke

2017/02/20 12:08

そこですか、出先なので間違ってるかもですが delete_allで、 Model.where("created_at<?",Time.now-(30.minites)).delete_all とかでいいんじゃないですかね?
misutaa

2017/02/20 23:23

やってみたのですが上手くいきません。。。 wheneverは諦めて、とりあえず自動でデータが消えれば大丈夫なので、わかる方いたら教えてください。
moonphase

2017/02/20 23:26

投稿はどこに保存してるんですか?memcachedやredis等に保存するなら、保存する時に有効期限を設定すれば自動で消えます。
moke

2017/02/21 00:25

>>やってみたのですが上手くいきません どうゆう風なコードに落とし込んで どういったエラーが出たor予想と違う結果が出たかを書いていただかないと ただでさえコードを晒さな過ぎです。 こだわらないのであれば ①で before_action :hoge, only: :index def hoge Model.where("created_at<?",Time.now-(30.minites)).delete_all end で問題なく動くはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問