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

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

ただいまの
回答率

90.36%

  • Ruby on Rails

    7642questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 718

pecchan

score 214

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 
を使うパターンと、使わないパターンの両方で
簡単なシステムを作ることにしました。

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

宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/28 12:24

    moke様

    お世話になっております。

    >callbackの制御が難しい といったところでしょうか?
    また知らないことが出てきました。
    理解を深めるため上記のことも調べてみます。

    >すぐに改良するというのに向いているフレームワークなので、ケースバイケースだと思いますけどね。
    なるほどです。
    あまり凝り固まらず、柔軟に選んでいきます。

    >親の名称を子にセットしたい等、割と「一般的にある要件」
    こちらは、検索時に毎回発生するJOINのコストを省きたいためです。

    いつも助けていただき感謝しています。
    本当に有難う御座います。

    キャンセル

  • 2017/03/28 14:02

    確かに、複雑なサブクエリとかを多用すると
    検索に時間がかかることは多いですが(特にMySQL5.5まで)
    最近はアルゴリズムの改善が進み、インデックスを正しく貼っていれば
    sqlで爆死することは少なくなってきています。
    むしろ不用意にstringのデータを持つことによって
    active_recordの生成コスト(メモリ制約)が発生する気がします。
    UNIX哲学に「推測するな、計測せよ」とありますが。
    web系は特にどこがボトルネックになるかは実際起きてみないとわからないことも多いです。

    そもそも、Railsというフレームワークはあまり早くありません
    仕様変更への柔軟性と圧倒的な記述コードの少なさが売りです。
    だから、最初はシンプルに、問題が起きたら都度対処という方が
    向いているし、幸せになれると思います。

    キャンセル

  • 2017/03/28 16:38

    moke 様

    有難う御座います。
    最近ではそうなんですね。

    Railsの特性も教えていただき有難う御座います。

    はい、Railsの設計思想に合わせてシンプルにいくことにします。
    やはり正規化を優先することにします。

    今後ともどうぞ宜しくお願い致します。
    有難う御座いました。

    キャンセル

check解決した方法

0

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

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

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

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

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

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

有難う御座いました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby on Rails

    7642questions

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