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

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

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

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

Q&A

解決済

2回答

874閲覧

Rils リレーションのエラーを可決したい

BKBKB

総合スコア8

Ruby on Rails

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

0グッド

0クリップ

投稿2020/06/10 06:43

documentモデルとitemモデルを紐ずけたいのですが、エラーになってしまいます。
companies.controller.rb@items = @documents.itemsの箇所でエラーになっております。

解決策わからず、誤りご指摘頂けますと幸いでございます。
初学者ですので、基本的なところが分かっていないのかもしれません。
ご回答をお待ちしております。

  
エラーメッセージ
NoMethodError in CompaniesController#index
undefined method `item' for #Document::ActiveRecord_Relation:0x00007fad5c334710
Extracted source (around line #5)

companies.controller.rb

ruby

1class CompaniesController < ApplicationController 2 def index 3 @company = Company.find(params[:company_id]) 4 @documents = Document.where(company_id: params[:company_id]) 5 @items = @documents.items 6 end 7end

document.rb

ruby

1class Document < ApplicationRecord 2 belongs_to :company 3 belongs_to :item 4 belongs_to :user 5end 6

item.rb

ruby

1class Item < ApplicationRecord 2 has_many :documents 3 has_many :item_users 4 has_many :users, through: :item_users 5end 6

マイグレーションファイル

ruby

1class CreateItems < ActiveRecord::Migration[5.0] 2 def change 3 create_table :items do |t| 4 t.string :name, null: false 5 t.integer :code, null: false 6 t.timestamps 7 end 8 end 9end 10 11-------- 12 13class CreateDocuments < ActiveRecord::Migration[5.0] 14 def change 15 create_table :documents do |t| 16 t.integer :date, null: false 17 t.string :author, null: false 18 t.string :image 19 t.references :company, foreign_key: true 20 t.references :item, foreign_key: true 21 t.timestamps 22 end 23 end 24end 25

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

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

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

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

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

guest

回答2

0

@documents = Document.where(company_id: params[:company_id])で取れるものは、Document集合(複数個ありうる、配列のようなもの)です。1個に対して実行するitemsメソッドは実行できません。

投稿2020/06/10 06:45

maisumakun

総合スコア146018

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

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

maisumakun

2020/06/10 06:47

@documentsに複数のDocumentが入ってきた場合、@itemsとして「どのようなもの」を取得したいか、それを先に明確にしてください。
BKBKB

2020/06/10 07:27

失礼しました。ご指摘ありがとございます。 下記内容で不足点があれば教えいただけると幸いです。 itemsテーブルにはnameとcodeのカラムがあり、いずれも値が入っております。 @itemsには@documentsに紐づく、itemを取得して、 ビューファイルで、 <% @items.each do |item| %> <%= item.name %> <%= item.code %> のような形で値を出したいと考えています。
maisumakun

2020/06/10 07:30

> @itemsには@documentsに紐づく、itemを取得して ですから、@documentsが複数だった場合は「どうしたい」ですか?
BKBKB

2020/06/10 08:11

失礼しました。 @documentsが複数の場合、それぞれ取得したいです。 companies.controllerを編集して 一つ目のデータを取得することはできました。 @items = Item.find(@documents[0][:item_id]) ご指摘いただいた内容を元に、再度調べてみましたが、 @documentsは複数ですので、どのように取得するべきか、詰まってしまいました。
guest

0

自己解決

最善の方法か分かりませんが、下記へ修正することで取り出せました。
より良い方法があれば教えていただけると幸いです。

companies_controller.rb

@items = [] @documents.each do |document| document_items_id = Item.find(document[:item_id]) @items << document_items_id end

投稿2020/06/11 00:05

BKBKB

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問