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

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

ただいまの
回答率

90.47%

  • Ruby

    7946questions

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

  • Ruby on Rails

    7495questions

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

複数の親子孫モデルをまとめて更新したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 225

niki

score 1

 前提・実現したいこと

親、子、孫と3つの関連テーブルがあり、親と子は1:1、子と孫は1:nの状態です。
親をwhere句で検索した後、検索結果の親に関連する子と孫の値を更新したいです。

#親モデルのリレーション
has_one :child, dependent: :destroy, inverse_of: :parent
accepts_nested_attributes_for :child

#子モデルのリレーション
belongs_to :parent, inverse_of: :child
accepts_nested_attributes_for :child_members

#孫モデルのリレーション
belongs_to :child, inverse_of: :child_members
#更新するコード※controllerに記述
p = Parent.where(id: params[:id])
p.colA = 0
p.child.colB = 10
p.child.child_members.colC = 20
p.save


※params[:id]は、Viewから渡されるidの配列で、ここに値が入っていて、SQLが実行されてデータが取れていることは確認しています
※colA,colB,colCは、それぞれのモデルにあるカラムで、更新時には画面から渡される値ではない値を入れたい

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

NoMethodError: undefined method `child' for nil:NilClass

 該当のソースコード

p.child.colB = 10

 試したこと

・親モデルを検索するときにfindを使うと、p.child.colBは取れますが、p.child.child_membersはNoMethodErrorになります

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

まず、childモデルにhas_many :child_membersが抜けています。

あとはそれが複数なのか単数なのかを意識してみましょう。

p = Parent.where(id: params[:id])
p.colA = 0
p.child.colB = 10
p.child.child_members.colC = 20
p.save


1行目ですが、whereはActiveRecord_Relationで返ってきます。簡単に言うと配列みたいな形です。
findと同じように使うなら.firstをつけましょう。

4行目ですが、child_membersは複数ですので、一括でcolCを20にするというのはできません。

p.child.child_members.each do |m|
  m.colC = 20
end


このように1つ1つ処理してやりましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/12 18:41

    ご回答をありがとうございます!
    一括では行えず、一つ一つループする方法になるのですね。
    それですと、ループの回数文、UPDATE文が発行されることになり、場合によっては負荷がかかるかもしれません。
    運用を考え、教えていただいた方法で行うか、SQLを直で書くか考えたいと思います。
    ありがとうございました!

    キャンセル

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

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

関連した質問

  • 受付中

    rails NoMethodError

    railsでNoMethodErrorが解消されません。 エラーの詳細は以下です NoMethodError in Picdatums#new Showing rails

  • 解決済

    NoMethodErrorと出てしまう

    前提・実現したいこと 与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ. 英小文字ならば(219 - 文字コード)の文字に置換 その他の文字はそ

  • 解決済

    NoMethodErrorの内容がよく理解できません

    前提・実現したいこと RPG用のキャラクター作成プログラムを作成しようとしています。 基本能力にボーナスポイントを割り振る機能である「assignment」メソッドを実装中に以

  • 受付中

    NoMethodError undefined methodのエラー

    NoMethodError in HomeController#index undefined method `id' for nil:NilClass とエラーが出ました。

  • 受付中

    aliasとalias_method、どちらを使うのがいい?(クラス宣言で書く場合)

    Rubyには同じメソッドに別名を付ける方法として、aliasとalias_methodの2つがあります。 alias…グローバル変数に別名を付けられる、構文なので文字列やシ

  • 受付中

    railsにてNoMethodErrorエラー

    前提・実現したいこと デフォルトの画像設定が上手くいきません。 Progateで学習した内容をcloud9を使って復習しているのですが標題のエラーで詰まっています。 過去の質問

  • 解決済

    セーブができない NoMethodError

     前提・実現したいこと 投稿をセーブして表示したいです。  発生している問題・エラーメッセージ NoMethodError in ChallengesController#cr

  • 解決済

    noMethodErrorについて

    表題のエラーが発生しております。 Rubyはほとんど触ったことがなく、簡単な質問で恐縮ですが @postを定義しているのでメソッドがない、未定義ではないと認識しているのですが、 @

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

  • Ruby

    7946questions

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

  • Ruby on Rails

    7495questions

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