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

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

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

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

Ruby on Rails 4

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

Q&A

解決済

1回答

1771閲覧

多対多のアソシエーションについて

hiyashikyuri

総合スコア388

Ruby

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2016/09/26 09:30

編集2016/09/26 12:38

多対多の一方を更にもう1つの多の要素をもたせたいと思っています。

class Product < ActiveRecord::Base has_many :product_materials has_many :materials, :through => :product_materials end class ProductMaterial < ActiveRecord::Base belongs_to :product belongs_to :material end class Material < ActiveRecord::Base has_many :product_materials has_many :products, :through => :product_materials has_many :material_subs has_many :subs, :through => :material_subs end class MaterialSub < ActiveRecord::Base belongs_to :material belongs_to :sub end class Sub < ActiveRecord::Base has_many :material_subs has_many :materials, :through => :material_subs end

以下のコードのように
@materials = @product.materialsのあとに「.subs」でレコードを持ってこれると思ったのですが、うまく行きませんでした。こういった場合はどのようにかけば反映されるのでしょうか?

def show @product = Product.find(params[:id]) @materials = @product.materials.subs respond_to do |format| format.json { render json: [ @product,@materials ]} end end

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

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

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

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

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

guest

回答1

0

ベストアンサー

うまく行きませんでした。

次からはどのようにうまく行かなかったのかを最初から書いておくといいと思います。

  • xxxという例外が発生した
  • @materials には xxx が入る事を期待していたが、XXXが入っていた

など


恐らく ** @materials = @product.materials.subs** で NoMethodError: undefined method 'subs' という例外が発生したのではないかなと思います。

なぜ例外が発生するのかというと
@product.materials では

Material のインスタンスではなく

Material::ActiveRecord_Associations_CollectionProxy のインスタンスが返ってきます。簡単に言えば配列のようなものにMaterialインスタンスがつまったような状態です。

なぜ、そういう事になるのかというと Product has_many Material としているので
@product.materials
1つの Material ではなく
[Material, Material, Material,....] という事になりうるからです。

さて、ここで [Material, Material, Material,....].subs は可能でしょうか?
不可能ですね?

ですので NoMethodError: undefined method 'subs' になります。


では、どうやって MaterialSub を取得すればいいでしょうか?

一番シンプルなのはeachで回せばいいですが。。。

ruby

1subs = [] 2@product.materials.each do |material| 3 subs << material.subs 4end

(eachではなくmapでもいいかもしれませんね)

@materials = @product.materials.sub とされているので欲しいのは subs ではなく materials なんですかね???

ちょっとその辺がよくわからないので、この辺までにさせていただきます。

投稿2016/10/12 05:39

hana-da

総合スコア1728

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問