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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

163閲覧

条件分岐に該当する場合メールを送信したい

koki0502

総合スコア19

Ruby on Rails 5

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2020/06/04 04:45

事前情報

現状のDBは下記画像の通りとなります
オーナーとカスタマーは自身のアカウントを1つ所有。
オーナーのアカウントはメールマガジンと1対多、カスタマーアカウントは支払い情報と1対多の関係にある。
オーナーアカウントとカスタマーアカウントは多対多の関係にあり、
account.membersでオーナーと紐付いている(※以下、メンバーとさせて頂きます)全てのカスタマーアカウントを取得できるよう設定。

イメージ説明

#実現したいこと
メンバー宛に送るメールのステータス(全員: 1, 支払情報有り: 2, 支払情報無し: 3)によって、送り主を振り分けたい。

##実際のコード
mail_magazines_controller.rb

def create @mail_magazine = current_owner.account.mail_magazines.build(mail_magazine_params) if @mail_magazine.save MailMagazineMailer.creation_email(@mail_magazine, current_owner).deliver_now redirect_to root_url else render :new end end

mailer/mail_magazines_mailer.rb

def creation_email(mail_magazine, current_owner) @mail_magazine = mail_magazine customer_accounts = current_owner.account.members #メンバーを取得 if @mail_magazine.status == 1 #問題なし @customers = customer_accounts.map{|customer_account| customer_account.customer} elsif @mail_magazine.status == 2 #支払情報ありのメンバー宛 payments = customer_accounts.map{|customer_account| customer_account.payments.find_by(account_id: current_owner.account.id)} #各メンバーが所有している支払い情報からオーナーアカウントに該当する情報があれば取得 @customers = payments.map{|payment| payment.customer_account.customer } elsif @mail_magazine.status == 3 #支払情報無しのメンバー宛 end mail( subject: @mail_magazine.title, to: @customers.map{|customer| customer.email}, from: "***@***.com" ) end

###実施した結果
下記エラーの表示
イメージ説明

####試したこと
Railsコンソールで確認

payments = Payment.all payments.map{|payment| payment.customer_account.customer } #問題なく取得化 owner = Owner.first customer_accounts = owner.account.members #メンバー取得 payments = customer_accounts.map{|customer_account| customer_account.payments.find_by(account_id: owner.account.id)} #各メンバーが所有している支払い情報からオーナーアカウントに該当する情報があれば取得 customers = payments.map{|payment| payment.customer_account.customer } #エラー 上記画像と同じく undefined method `customer_account' for nil:NilClass となる

mapメソッドで取得した情報は、再びmapメソッドを使うことができない?のでしょうか。
また、その他解決策等ご教示いただけますと幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

rb

1payments = customer_accounts.map{|customer_account| customer_account.payments.find_by(account_id: owner.account.id)}

の結果にnilが含まれているんだと思います。

rb

1customers = payments.compact.map{|payment| payment.customer_account.customer }

とすればエラーの回避自体はできると思います。

投稿2020/06/04 04:50

Mugheart

総合スコア2349

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

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

koki0502

2020/06/04 04:57

早々にご回答頂き誠にありがとうございます! compactメソッド初めて知りました! 大変勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問