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

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

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

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

Q&A

解決済

2回答

4049閲覧

【Ruby on Rails】nested_attributes_forを使うメリットと、使わず実現する場合

pecchan

総合スコア555

Ruby on Rails

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

0グッド

1クリップ

投稿2017/03/21 02:12

編集2017/03/23 05:01

Ruby on rails初心者です。 Rails 5.0.1

伝票画面など親子関係のあるモデルを扱う際は、
hasManyやbelongs_to等の「アソシエーション」と、
「accepts_nested_attributes_for」の記述が1セットで必要と勘違いしておりました。

その後、少しずつ頭が整理でき、モデルのCRUDだけならば「アソシエーション」だけで実現できると知りました。
accepts_nested_attributes_forを使わずに、もっと素直にできることがわかった。

では、nested_attributesは
何のために存在しているのでしょうか?

また分からなくなってきました。

Viewで、子(行)の操作を簡単に実現するためでしょうか?
であれば
nested_attribute_forを使わず、子の操作部分を実現したい場合、
どのようにするのが一般的なのでしょうか?

ネットや書籍を探しても見つけることが出来ませんでした。
※アソシエーションや、nested_attribute_forの使い方ばかりです

地道に記述していくのでしょうか?

下記の理由から、nested_attribute_forは、使わず親子モデルの操作(明細行の編集など含む)を実現したいと考えております。
【Ruby on Rails】accepts_nested_attributes_forで親の任意のデータを子にセットしたい

見当違いなことを質問してたら大変恐縮ですが、どうぞ宜しくお願い致します。

【2017/03/23 追記】
teratail内にずばり同じ内容がありました。
親要素のフィールドから受け取った値を子レコードに反映させたい

上記で回答者の方が「accepts_nested_attributes_for 」について語っておられました。
要は
「便利だが、自由度が低くなりがちで型にはまったシーンでしか利用できません。」
ということでした。

しかしまだ具体的なイメージが付きません。

なので
accepts_nested_attributes_for
を使うパターンと、使わないパターンの両方で
簡単なシステムを作ることにしました。

理解、整理出来ましたら追記致します。

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

少々外遊してまして。。。
返信が遅くなりました。
メリット
むしろ、ボタンクリックで子に値をセットしつつ追加っていうのが簡単にできるのが
nested_attribute_forのメリットだと思います
前にも書きましたが、nested_formやcocoonといったgemで簡単に実現可能です。
若気の至りで作った三系統4重のネストを使ったモデルも何とか動いてますし
多少複雑なモデルでもサクッと作るぶんには、何とかなります。
デメリット
コードがぐちゃぐちゃになる
これに尽きると思います。
肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳)
にも書いてありますがrailsでありながら変更に弱すぎるしcallbackの制御が難しい
といったところでしょうか?

しかし、Rails自体サクッと作ってチャッと動かして、フィードバックをもらい
すぐに改良するというのに向いているフレームワークなので、ケースバイケースだと思いますけどね。

まあ、私は相変わらず、親の名称を子にセットしたい等、割と「一般的にある要件」
これが一般的にある要件だとは到底思えないのですが
古い日本製のソフトを見るとよく出てくるのですが、そんなに高頻度で必要になる
データではないし、どうしても必要なら、どうせつけるであろう変更履歴を管理する
データに、初期データflagでも立てておけばいいんじゃないかなぁと

投稿2017/03/28 03:12

moke

総合スコア2241

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

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

pecchan

2017/03/28 03:24

moke様 お世話になっております。 >callbackの制御が難しい といったところでしょうか? また知らないことが出てきました。 理解を深めるため上記のことも調べてみます。 >すぐに改良するというのに向いているフレームワークなので、ケースバイケースだと思いますけどね。 なるほどです。 あまり凝り固まらず、柔軟に選んでいきます。 >親の名称を子にセットしたい等、割と「一般的にある要件」 こちらは、検索時に毎回発生するJOINのコストを省きたいためです。 いつも助けていただき感謝しています。 本当に有難う御座います。
moke

2017/03/28 05:02

確かに、複雑なサブクエリとかを多用すると 検索に時間がかかることは多いですが(特にMySQL5.5まで) 最近はアルゴリズムの改善が進み、インデックスを正しく貼っていれば sqlで爆死することは少なくなってきています。 むしろ不用意にstringのデータを持つことによって active_recordの生成コスト(メモリ制約)が発生する気がします。 UNIX哲学に「推測するな、計測せよ」とありますが。 web系は特にどこがボトルネックになるかは実際起きてみないとわからないことも多いです。 そもそも、Railsというフレームワークはあまり早くありません 仕様変更への柔軟性と圧倒的な記述コードの少なさが売りです。 だから、最初はシンプルに、問題が起きたら都度対処という方が 向いているし、幸せになれると思います。
pecchan

2017/03/28 07:38

moke 様 有難う御座います。 最近ではそうなんですね。 Railsの特性も教えていただき有難う御座います。 はい、Railsの設計思想に合わせてシンプルにいくことにします。 やはり正規化を優先することにします。 今後ともどうぞ宜しくお願い致します。 有難う御座いました。
guest

0

自己解決

親子モデルの登録を、nested_attributes_forを使う場合と、使わない場合の2つ作成し比較してみました。

ruby on rails初心者が恐れ多いのですが、
nested_attributes_forを使うに適した場面、メリット、デメリットなどを自分なりに整理しました。

●適した場面
表現が難しいですが、一言で言うと
シンプル・簡素なアプリの場合のみ。

●メリット
Scaffoldじゃないけど、サクッと親子モデル作る場合にお手軽、素早く作れる。
これがウェブ上に一番多いnested_attributes_for推しのメリット。
個人的には、view側で連携したメソッドで行編集まで簡単に出来ることかと。
ボタンクリックで子に値をセットしつつ追加とか私には無理です( ノД`) jQuery得意な方には余裕?

●デメリット
親の名称を子にセットしたい等、割と「一般的にある要件」の場合には早くも変な感じになってくる。
コントローラで対応したり、modelでもいけるけど強引な感じになったり。

以上でした。
勘違いあればご指摘下さい。

有難う御座いました。

投稿2017/03/24 04:48

pecchan

総合スコア555

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問