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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

Q&A

2回答

1551閲覧

「旅行先とユーザーの年齢、性別」を入れただけで持ち物チェックリストが出力されるような仕様を目指しています

sn.jr

総合スコア53

Ruby

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

0グッド

1クリップ

投稿2020/03/02 07:34

編集2020/03/02 07:42

現在、旅行の持ち物チェックリストが「旅行先とユーザーの年齢、性別」を入れただけで出力されるようなサービスを作っております。持ち物チェックリストの構成は「旅行先とユーザーの年齢、性別」によって変わります。このような仕様を作るためには、どこに条件分岐を描けばよろしいのでしょうか?DBのレコードに条件を書くことなどは可能なのでしょうか?

ユーザーの特徴を入力したらそれを元にしたデータが出力されるという点では占いアプリなどに近いのかもしれません。

理想

Itemテーブルにもともと持ち物を入れておいて、ユーザーの年齢、性別によって条件に当てはまる持ち物のみが出力されるという仕様にしたいです。

イメージ↓(このような仕様ができるのか?)
Itemテーブル
||name|条件|
|:--|:--:|
||passport|if user.age >= 20|
||化粧品|if user.gender == female|

21歳かつ女性が使った場合、持ち物チェックリストにはパスポートと化粧品が出力されている。
## 前提
持ち物テーブル、ユーザーテーブル、旅行先テーブルを用意しました。

** 持ち物テーブル(Item) **

  • nameカラム

パスポート
水着
浮き輪
などの旅行の持ち物をデータとして持たせています。

** ユーザーテーブル(User) **

  • 年齢カラム
  • 性別カラム

** 旅行先テーブル **

  • name

ユーザーテーブルと持ち物テーブルは多対多の関係です。同じく旅行先テーブルも。

*ユーザーが入力するのは旅行先、年齢、性別のみ。持ち物チェックリストを自ら記入はしない。

## 試したこと

*ユーザーテーブルと持ち物テーブルのみ

意図

Userのインスタンスメソッドcheck_itemを作成し、ユーザーの年齢と性別によって持ち物が作成される。

問題点

今後条件が年齢や性別、さらには旅行先などの条件が追加されることを考えるとモデルにこのようにインスタンスメソッドを書いてif文で条件分岐を書くのはあまりようくないのではないか。

rb

1class User < ApplicationRecord 2 has_many :user_items 3 has_many :items, through: :user_items 4 enum gender: {male: 0, female:1} 5 def check_item 6 if self.age >= 20 && self.male? 7 self.items.create(name:"passport") 8 self.items.create(name:"shirt") 9 elsif self.age >= 20 && self.female? 10 self.item.create(name:"化粧品") 11 end 12 end 13end 14

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

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

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

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

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

guest

回答2

0

テーブルに条件を保持したとして、あくまで単なる文字列であってコードではありません。
evalのような機能で実行させるのも悪手です(Ruby詳しいわけではないのでそういう機能があるかどうかは知らないですが)。

条件になりえるものって決まってるはずなので、そのぶんカラムを準備して値をいれておき、検索用のSQLで条件に沿ったものを取得できるようにすべきと思います。
もし「以上」「以下」など条件がわかれるものがあるのでしたらそれも設定用のカラムを用意し判断できるようにしておきましょう。

投稿2020/03/02 07:42

m.ts10806

総合スコア80875

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

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

sn.jr

2020/03/02 07:50

ご回答ありがとうございます。なるほど!一段落目は理解しました!誠に申し訳ないのですが「そのぶんカラムを準備して値をいれておき、検索用のSQLで条件に沿ったものを取得できるようにすべき」の部分がなんとなくは理解できるのですが、具体的にどうすればいいのかというところまで落とし込めていません。 例えば「持ち物テーブルにあるパスポートは年齢が20歳以上のユーザーにのみ必要となる」という仕様を目指した時、検索用のSQLはどこに、どのような条件で記入すれば良いのでしょうか?
m.ts10806

2020/03/02 07:59

例ですが、 アイテムの種類によって使わない条件があるのでしたら無駄になるので、 「持ち物条件テーブル」を別途設けておくとかですね。 で、持ち物をキーに探すと条件が決まる、と。 持ち物と条件で1対多です。
sn.jr

2020/03/02 08:05

改めてご返答ありがとうございます!なるほど、今まで条件をテーブルに入れたことがなかったのでその発想はありませんでした。とても参考になります。持ち物条件テーブルには @user.age >= 20などを入れておく理解でよろしいでしょうか?度重なる質問失礼します。
m.ts10806

2020/03/02 08:09

いえ、ですからそのまま入れたらダメですって。 持ち物条件テーブルは 持ち物 条件項目 内容 条件 のようにカラムを用意し パスポート 年齢 20 以上 のように値を持っておく感じです。 日本語名になっているところはなるべくコードのように不変のもので持っておくと楽です。
sn.jr

2020/03/02 08:17

なるほど!理解しました。ありがとうございます!条件を持ち物条件テーブルに各持ち物とアソシエーションした状態で設定するということですね。ユーザーに行ってもらいたい作業は年齢と性別の入力のみなのですが、入力してもらったものが条件テーブルに合致した時、持ち物が出力されるということでよろしいでしょうか?
m.ts10806

2020/03/02 09:58

先に言っておけば良かったですが、ER図のようなものは書いた方が良いです。手法の前に設計や構造を図にしましょう。 そうすると矛盾や運用が難しい点も気づけるはずです。
sn.jr

2020/03/02 10:10

アドバイスありがとうございます!そのようにいたします!
sn.jr

2020/03/02 10:42

ER図を書いてみましたが、持ち物条件テーブルに書かれた条件とuserの年齢、性別を比較しその結果をどのようにItemの出力に反映させればいいのかまではわかりませんでした。ちなみに私が上記の試したことに載せているようなやり方はあまり望ましくないでしょうか?
m.ts10806

2020/03/02 10:45

DBに保存するのはあくまで検索に必要な情報そのものであって式(のような文字列)であってはいけません。
sn.jr

2020/03/02 11:00

失礼いたしました。上記というのはそもそもの質問の「試したこと」の項目に添付しているコードのことをさしていました。
guest

0

持ち物に、性別や年齢のMIN/MAXを指定しておけば、
SQL文でユーザーから条件指定してとってくることは可能だと思います。
ただ、これだとどの人がどの持ち物がOKかチェックができなくなりますので、別途チェック用のテーブルに、その人と持ち物の組み合わせを追加していってあげてそこでチェックしてあげていかないといけないかなと思います。
恐らくユーザー登録時に、持ち物テーブルから必要なものを引っ張ってきてユーザーの持ち物テーブルに追加してあげて、そこに更新かけていく感じになると思います。

  • ユーザーテーブル
idnameagesexdestination
user_1山田花子20fdestination_1
user_2田中太郎40mdestination_2
  • 持ち物(fは女性、mは男性、fmは両方。ブランクにして指定ナシにするのでもいいかも)
idnamesexage_minage_max
item_1passportfm
item_2cosmef18
item_3Sanitary goodsf1050
item_4shaverm16
  • ユーザーの持ち物テーブル(0:未準備/1:準備OK)
user_iditem_idchacked
user_1item_11
user_1item_20
user_1item_30
user_2item_11
user_2item_40
  • 旅行先
idname
destination_1ハワイ
destination_2上海

投稿2020/03/15 07:06

oec

総合スコア271

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問