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

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

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

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

Q&A

1回答

374閲覧

データを作成したら、同時に別に集計用データを作成し、更新したら、同時に別に集計用データも更新したいですが、方法が分かりません。

watagashi

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2020/06/19 02:54

前提・実現したいこと

Ruby on Railsで気分のマッチングをするシステムを作っています。

ユーザーとパートナーは一対一で存在.
各ユーザーは毎日気分のtrue/falseを記録していき、
パートナーも同様に気分のtrue/falseを記録していきます。
気分データは一日単位で集計、一日に複数回更新があったら年月日をみて同じであれば更新、同じでなければ作成というロジックにしてます。

ユーザーとパートナーの気分2つを組み合わせて一つのMatchedというデータとしたいです。

ユーザーtrue/パートナーtrue => matched ユーザーfalse/パートナーtrue => not matched ユーザーnull/パートナーtrue => not entered ユーザーnull/パートナーnull => データ作成しない

といったMatchedテーブル作り、matchedやnot matchedのcount集計をしたいです。

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

ユーザー、パートナーが気分データを作成したら、同時にMatchedデータを作成し、更新したら、同時にMatchedデータも更新したいですが、方法が分かりません。

毎日気分を記録するMoodテーブルに is_good true/falseは記録できているのですが、ここでデータ作成時にMatchedを作るのは設計が間違ってる気がします。

ruby

1# moodをcreate 2def create 3 partner = User.find_by(invitation_code: @auth_user.partner_code) 4 if partner == nil 5 render status: 406, json: { status: 406, message: 'Partner not found' } 6 return 7 end 8 9 my_lastest_mood = @auth_user.moods.last 10 partner_latest_mood = partner.moods.last 11 12 now = Time.current 13 updated_time = Time.parse(my_lastest_mood.updated_at.to_s) 14 partner_mood_updated_time = Time.parse(partner_latest_mood.updated_at.to_s) 15 16 if my_lastest_mood == nil 17 create_new_mood 18 if partner_latest_mood == nil 19 if mood_params == true 20 Matched.new(type: 2) 21 else 22 Matched.new(type: 3) 23 end 24 elseif 25 ......... 26 end 27 return 28 end 29 30 31 if updated_time.year == now.year && updated_time.month == now.month && updated_time.day == now.day 32 if my_lastest_mood.update(mood_params) 33 render status: 200, json: { status: 200, message: 'Mood was successfully updated.', data: my_lastest_mood } 34 else 35 render status: 406, json: { status: 406, message: 'Mood does not updated.', data: updated_time.year == now.year } 36 end 37 else 38 create_new_mood 39 end 40 end

ruby

1def create_new_mood 2 mood = @auth_user.moods.build(mood_params) 3 if mood.save 4 render status: 200, json: { status: 200, message: 'Mood was successfully created.', data: mood } 5 else 6 render status: 406, json: { status: 406, message: 'Mood does not created.' } 7 end 8 end

該当のソースコード

現状、true/falseのセットで一つとなる様なデータが作れていないので下記のようになっています。

response

json

1matchings: [ 2{ 3 me : true 4 partner : false 5}, 6{ 7 me : true 8 partner : false 9} 10]

ruby

1def show 2 year = params[:year] 3 month = params[:month] 4 5 time = Time.local(year, month) 6 7 from = time.at_beginning_of_day 8 to = (from + 1.month) 9 10 my_moods = @auth_user.moods.where(updated_at: from...to) 11 partner = User.find_by(invitation_code: @auth_user.partner_code) 12 13 if partner != nil 14 partner_moods = partner.moods.where(updated_at: from...to) 15 16 formatted_partner_moods = partner_moods.map { | mood | 17 updated_time = Time.parse(mood.updated_at.to_s) 18 DayMood.new(updated_time.day, mood.good) 19 } 20 21 formatted_my_moods = my_moods.map { | mood | 22 updated_time = Time.parse(mood.updated_at.to_s) 23 DayMood.new(updated_time.day, mood.good) 24 } 25 26 matchings_grouped_by_days = [] 27 range = 1..31 # 1ヶ月分を決め打ちで常に31日分データ作成している 28 range.each { |num| 29 30 p = formatted_partner_moods.find { |mood | 31 mood.getDay() == num 32 } 33 34 me = formatted_my_moods.find { | mood | 35 mood.getDay() == num 36 } 37 matching = Matching.new(num, me&.getGood(), p&.getGood() ) 38 matchings_grouped_by_days << matching 39 } 40 render status: 200, json: { status: 200, message: 'partner created', data: matchings_grouped_by_days } 41 else 42 render status: 204, json: { status: 204, message: 'no partner' } 43 end 44 end

ruby

1class Matching 2 def initialize(day, me, partner) 3 @day = day 4 @me = me 5 @partner = partner 6 end 7end 8 9class DayMood 10 def initialize(day, good) 11 @day = day 12 @good = good 13 end 14 15 def getDay() 16 return @day 17 end 18 19 def getGood() 20 return @good 21 end 22end 23

理想はこちらで集計して返したいです。

json

1{ 2 matching : 2 # 回数 3 not matching : 13 4}

勉強不足だと思うので、調べ方や参考サイトを教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

『毎日気分を記録するMoodテーブルに is_good true/falseは記録できているのですが、ここでデータ作成時にMatchedを作るのは設計が間違ってる気がします。』
とのことですが、なぜ間違えているとお考えですか?
気分のPostが有った時に、MoodにもMatchedにも影響を与えるのですから、両方を更新することに問題が有るとは思えないのですが。

投稿2020/06/19 05:40

winterboum

総合スコア23567

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

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

watagashi

2020/06/19 08:29 編集

回答ありがとうござます。 > 気分のPostが有った時に、MoodにもMatchedにも影響を与えるのですから、両方を更新することに問題が有るとは思えない やはりそういうものですよね。 Matchedがmood_idやuser_idを持ってmoodだけ更新しておけばmatchedが実質的に更新できる様な作りをイメージしていたため、二重管理の様に感じて設計が間違ってると思っておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問