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

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

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

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

1043閲覧

【ruby on rails】セレクトボックスを利用したDB登録時、KeyとValueのワンセットで登録したい

pecchan

総合スコア555

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/03/08 08:54

編集2017/03/08 08:56

初歩的なことで恐縮です。

部門マスタと社員マスタがあります。

社員マスタの新規追加時に、
社員マスタに対して、部門のIDと名称の両方を登録したいです。

社員マスタのフィールド
・社員ID
・社員名
・部門ID
・部門名

画面にはヘルパーで部門のセレクトボックスを用意しました。

部門IDは登録出来たのですが、部門名が登録されません。

社員マスタの部門セレクトボックス

html

1<table class="table "> 2 <tr> 3 <th><%= form.label :id, "部門" %></th> 4 <td><%= form.select :dep_id, Department.all.map { |p| [p.dep_name, p.id] } %></td> 5 6 </tr> 7</table>

具体的な記述方法が分かりません。
どうか宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

前も同じ質問に答えた気がしますが。
結論から言いますと、する必要が全くないということです。
主な理由としては
0. クライアントとサーバーの通信量と回数は少なければ少ないほどいい

  1. サーバー側が部門IDと部門名の紐付けを理解しているので、必要な時に結合すればいい(そもそもそれがRelationalDataBaseという概念)
  2. RelationalDataBaseはできれば正規化(同じ情報を被って保存しない)することが望ましい

つまり社員モデルが部門名を持っているということが設計上の間違いなのです。

それでもどうしてもしたい、あえて正規化を崩したい
(検索時の負荷とかの正当な理由で)というときは
社員 modelで

ruby

1after_save :set_bumon_name 2belongs_to :department 3def set_bumon_name 4self.dep_name=self.department.dep_name 5end

というふうにして、くれぐれも部門名を送る
ということは考えないでください。


Department.all.map { |p| [p.dep_name, p.id] }
ですが
Department.pluck(:dep_name,:id)
にすると見た目にも実行速度的にもサイコーです。

投稿2017/03/08 10:14

編集2017/03/08 10:34
moke

総合スコア2241

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

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

pecchan

2017/03/10 00:44

恐れ入ります。 Ruby on Railsは初心者ですが、システム開発は10年以上になります。 あえて正規化を崩すのは一般的ですよね。 毎回、部門マスタから「最新の部門名」を引っ張るのではなく、 「社員マスタに登録した時点の部門名」が欲しいのです。 その時点の情報で良いわけです。
pecchan

2017/03/10 00:50 編集

こういった要件の場合、Ruby on railsでは 教えていただいた方法(登録時にマスタから参照してセットする)が一般的なのですか? 一般的な作法が分かっていません。
moke

2017/03/10 01:01 編集

先輩でしたか、若輩者が舐めた口を聞いて申し訳ございません。 after_create :set_bumon_name belongs_to :department def set_bumon_name self.dep_name=self.department.dep_name end というふにすると 作成時の一回のみ部門名が登録されます。 Ruby on railsというよりweb系ではこれが一般的です。
pecchan

2017/03/10 01:04

今までデスクトップ開発ばかりでWeb系は、まだまだ若輩者でございます。 ご親切に教えていただき有難う御座いましたm(__)m
moke

2017/03/10 01:19 編集

私もシェアの多いだけのOSに何度も苦しみました(TT) 上記のようにすると、登録フォームと更新フォームを同じにできることも利点です。 (DRY:Don't Repeat Yourself)の魅力を満喫してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問