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

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

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

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

Ruby on Rails

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

Q&A

解決済

3回答

2959閲覧

DBカラム同士での計算方法

mk12-8078

総合スコア16

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/10/24 06:16

前提・実現したいこと

Railsで簡単な燃費計算ができるアプリを作っています。
ユーザーが入力した情報は「infomationテーブル」に保存されている。

ユーザーが走行距離(range)と給油量(refuel)を入力したら、自動的に燃費(fuel_economy)が計算され,
それぞれのカラムに保存されるようにしたい。

:fuel_economy = :range / :refuel
ができるようにしたい。

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

どこで計算させればいいか調べたがわからず、記載方法もわからない。 コントローラー、モデル?

試したこと

最初は、コントローラーに記載し、

private def infomation_params   :fuel_economy = :range / :refuel params.require(:infomation).permit(:refuel, :cost, :refuelday, :range, :fueltype_id, :fuel_economy).merge(user_id: current_user.id) end

としたが、エラーがでた。

現状はテーブルのfuel_economyではなく、view(〇〇.html.haml)上で、

  • fuel_economy = range / refuel

を計算させ表示させている。
しかしながら、これでは将来改修など行った時に不都合になる。

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

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

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

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

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

guest

回答3

0

ユーザーが走行距離(range)と給油量(refuel)を入力したら、自動的に燃費(fuel_economy)が計算され,

それぞれのカラムに保存されるようにしたい。

燃費自体を集計関数にかけたいなどの扱いをする必要があるなら別ですが、そうでないなら「他の列から算出できる値」をデータベースに保存する必要はありません

他の列から算出可能な値を保存してしまうと、「データ容量を不必要に消費する」「矛盾するデータを投入できてしまう」など、そちらのほうが不都合です。

投稿2020/10/24 22:54

maisumakun

総合スコア146018

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

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

maisumakun

2020/10/24 22:55

> テーブルのfuel_economyではなく、view(〇〇.html.haml)上で モデルに計算用メソッドを作る、ではだめでしょうか?
mk12-8078

2020/10/25 02:07

燃費を集計関数にかけ、最小値、最大値を表記したり、グラフ化できるようにする必要があるため、データベースに保存する必要があります。 今は、フロントのイメージを掴むためにviewで計算させ表示させていますが、誤魔化している状態です。
guest

0

infomation_paramsでやる場合
:fuel_economy = :range / :refuel

params[:infomation][:infomation] = params[:infomation][:range].to_f/params[:infomation][:refuel].to_f
見苦しいし、refuelがnilやゼロの時の対策が厄介

def create でやる場合
@information = Information.new(infomation_params) の後
@information.fuel_economy = @information.range / @information.refuel if @information.refuel > 0

だがこういうことはmodelでやらせたい

before_save :set_fuel_economy def set_fuel_economy fuel_economy = range / refuel if refuel > 0 end

投稿2020/10/25 23:02

winterboum

総合スコア23567

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

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

mk12-8078

2020/10/26 10:20

連絡ありがとうございます。 modelにコードを打ちましたが、値が入力されていませんでした。 また、def create でもやってみましたが、"undefined method `refuel' for nil:NilClass"と表示されてしまい、保存そのものができませんでした。 ご教授いただいたコード以外に入力しないといけないコードが存在するのでしょうか?
guest

0

自己解決

データベースへの保存は諦め、
array = []
で計算結果を収納し、
array.max
array.min
で取得することにしました。

投稿2020/11/13 14:27

mk12-8078

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問