1.前提・実現したいこと
定時処理で、「新しいレコードの作成」と「既存レコードにおけるstatusカラムの値を変更」したい。
フレームワーク:ruby on rails
定時処理を行うために、rake taskでtaskを作成し、それをwheneverを用いて動かそうと思っているが、今回の問題は、wheneverを使う前のtaskで生じている。
具体的には、
①Testモデルにおいて最新レコードのstatusカラムを"newest"から"old"に変更
②Testモデルのレコードを新規作成し、このレコードのstatusカラムを"newest"とする
これらを一定時間ごとに行いたい。
statusカラムの値変更については、updateメソッド
レコードの新規作成にはcreateメソッド
を使おうと考えているが、lib>tasks の中では、これらのメソッドが使用できないと考えられる。
以下でそう考えられる理由を説明をする。
2.発生している問題・エラーメッセージ
現在、railsのrake taskを用いて①及び②の処理を行おうとしている。
作成したtaskが動くか確かめるために、ターミナルでrake taskを実行したところ、
NoMethodError: undefined method `update' for nil:NilClass
上記のエラーが発生。
3.該当のソースコード
test.rb
ruby
1class Test < ApplicationRecord 2 enum status: { newest: 0, old: 1 } 3end
change_status.rake
ruby
1namespace :change_status do 2 3 desc "Create a New Test." 4 task create_new_test: :environment do 5 # "最新のTestのステータスを変更" 6 tests = Test.where(status: "newest") 7 new_test = tests.order(updated_at: :desc)[-1] 8 new_test.update(status: "old") 9 # "新しいTestを作成" 10 Test.create(status: "newest") 11 end 12 13end
4.仮説
rake taskの中で、クラスメソッドである.updateや.createを使えないのだと思うが、どうやって使えるようにすればいいのかが分からない。
そもそも、この定時処理をrake taskで行うべきなのかどうかも分かっていないが、このtaskの中で.createや.updateが使用できるのであれば実装可能だと考えている。
何かアドバイスや、解決方法を知っている方がいらっしゃいましたら、ご教授いただきたく存じます。
また、根本的に考え方が間違っている箇所等ございましたら、ご遠慮なくご指摘ください。
5.ツール・補足情報
フレームワーク:ruby on rails
テキストエディタ:VScode
変数名やカラム名には、実際に使っているものと別の命名をしています。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/04 09:05 編集
2022/02/04 09:24 編集
2022/02/04 09:30
2022/02/04 11:11
2022/02/04 11:13
2022/02/04 11:46