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

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

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

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

Ruby

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Q&A

解決済

1回答

983閲覧

ループ処理中に起こったエラーをスキップして処理を継続したい場合、どのようにコードを書けばよいでしょうか?

akikko

総合スコア32

Ruby on Rails 5

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

Ruby

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

0グッド

0クリップ

投稿2023/03/16 08:22

実現したいこと

クラウドファンディングのようなサイトをrailsで開発・運営しております。

Event(企画) を応援したContributor(寄付者)の寄付金額の手数料のカラムを、
コマンド入力で一気にアップデートしたいです。
しかし、Contributorに紐づいているEventが削除されているとエラーが発生してしまいます。
(Eventが削除されていても、Contributorは削除されておりませんため)

Eventが削除されていても、同じアップデートを継続させたいのですが、
どのようにコーディングすればよいのでしょうか?
大変お忙しい中恐縮ですが、教えて頂けますと大変嬉しいです。

開発の前提

クラウドファンディングのようなサイトをrailsで開発・運営しております。

発生している問題・エラーメッセージ

ruby

1undefined method `created_at' for nil:NilClass

該当のソースコード

models/concerns/Fee_update.rb

ruby

1module Fee_update 2 class Fee_up 3 def self.fees 4 Contributor.preload(:event).find_each do |contributor| 5 if contributor.event.created_at < Date.new(2021,8,1) 6 fee_stripe = contributor.contribution_amount * 0.036 7 fee_we = contributor.contribution_amount * 0.214 8 fee_user = contributor.contribution_amount * 0.75 9 else 10 fee_stripe = contributor.contribution_amount * 0.036 11 fee_we = contributor.contribution_amount * 0.264 12 fee_user = contributor.contribution_amount * 0.7 13 end 14 contributor.update!(fee_stripe:fee_stripe, fee_we:fee_we, fee_user:fee_user) 15 end 16 end 17 end 18end 19

実行コマンド

ruby

1heroku run rails runner Fee_update::Fee_up.fees

カラム
Contributor

ruby

1event_id #こちらによって、Eventと紐づいています 2fee_stripe 3fee_we 4fee_user

試したこと

https://style.potepan.com/articles/30566.html#Ruby-2
こちら等、色々見まして、
begin
resque
end
を使用すればよいことは分かってきたのですが、
if内でどう処理をすれば、コマンドの実行が継続されるのかが分からず、途方に暮れております。

大変お忙しい中申し訳ありませんが、教えて頂けますと本当に助かります。
どうぞよろしくお願い申し上げます。

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

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

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

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

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

hatsu

2023/03/16 08:47

Eventが存在しないContributorは処理をしない、でもいい仕様でしょうか? それならばeventが存在しない場合はスキップしたり、で解決可能と思いましたが。
akikko

2023/03/16 08:59

ありがとうございます!取り急ぎ、それでも大丈夫です! どのようなコーディングの仕方になるものでしょうか? すいません、お忙しい中ご回答頂きまして本当にありがとうございます。
guest

回答1

0

ベストアンサー

eventが存在しないときにするスキップする場合は、
each文の中で next if contributor.event.blank?のような条件文を書いてあげると、contributor.event.blank?true の時にnextが実行され、7行目以降は処理されず次のcontributorの処理が始まるようになります。
以下例です。

ruby

1module Fee_update 2 class Fee_up 3 def self.fees 4 Contributor.preload(:event).find_each do |contributor| 5 // NOTE: ここでcontributor.eventがblankの時には空にする 6 next if contributor.event.blank? 7 if contributor.event.created_at < Date.new(2021,8,1) 8 fee_stripe = contributor.contribution_amount * 0.036 9 fee_we = contributor.contribution_amount * 0.214 10 fee_user = contributor.contribution_amount * 0.75 11 else 12 fee_stripe = contributor.contribution_amount * 0.036 13 fee_we = contributor.contribution_amount * 0.264 14 fee_user = contributor.contribution_amount * 0.7 15 end 16 contributor.update!(fee_stripe:fee_stripe, fee_we:fee_we, fee_user:fee_user) 17 end 18 end 19 end 20end

そのほか、事前に Contributor.where.associated(:event),find_each do |contributor|のように、そもそもeventが紐づいているデータのみをeachするようにしておくとかもありそうです。(DBのリレーションが正確には不明なため補足でこちらは書いております。

投稿2023/03/16 09:05

hatsu

総合スコア1809

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

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

akikko

2023/03/16 09:10

こんなに短時間の間に、的確なアドバイスを下さいまして本当にありがとうございます!! なるほど、ループ処理前か処理後のどちらでも可能なのですね!! ありがとうございます、大変勉強になります。 早速頂きました内容にてトライいたします!!
akikko

2023/03/16 09:37

無事、設定することが出来ました!!大変ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問