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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

981閲覧

条件に合った商品のみ一覧表示したい

yousuke44

総合スコア2

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/07/16 08:03

前提・実現したいこと

大学の教科書販売サイトを作成しています。ユーザーがログインした時にそのユーザーのuniversity_idと出品者のuniversity_idが合致する商品のみ、商品一覧で表示したいです。

発生している問題

itemコントローラーのindexアクションの記述方法が分からない状態です。

該当のソースコード

app > controllers > item_controller.rb

ruby

1class ItemsController < ApplicationController 2 before_action :authenticate_user!, only: [:new, :create] 3 4 def index 5 @items = Item.order('created_at DESC') 6 end 7 8 def new 9 @item = Item.new 10 end 11 12 def create 13 @item = Item.new(item_params) 14 if @item.save 15 redirect_to root_path 16 else 17 render :new 18 end 19 end 20 21 private 22 def item_params 23 params.require(:item).permit(:name, :price, :year_period_id, :lecture, :teacher, :sales_status_id, :scheduled_delivery_id, :author, :publisher, :image).merge(user_id: current_user.id) 24 end 25end

app > models >user.rb

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 extend ActiveHash::Associations::ActiveRecordExtensions 8 belongs_to :university 9 belongs_to :department 10 has_many :items 11 12 with_options presence: true do 13 validates :nickname 14 validates :birthday 15 16 with_options numericality: { other_than: 1, message: "を選択してください" } do 17 validates :university_id 18 validates :department_id 19 end 20 end 21 22 PASSWORD_REGEX = /\A(?=.*[a-zA-Z])(?=.*?\d)[a-zA-Z\d]+\z/i.freeze 23 validates_format_of :password, with: PASSWORD_REGEX, message: 'は半角英字と半角数字の両方を含めて設定してください' 24end

app > models >item.rb

ruby

1class Item < ApplicationRecord 2 extend ActiveHash::Associations::ActiveRecordExtensions 3 belongs_to :year_period 4 belongs_to :sales_status 5 belongs_to :scheduled_delivery 6 belongs_to :user 7 has_one_attached :image 8 9 with_options presence: true do 10 validates :image 11 validates :name 12 13 with_options numericality: { greater_than: 0,allow_blank: true }, format: { with: /\A[0-9]+\z/,allow_blank: true } do 14 validates :price 15 end 16 17 with_options format: { with: /\A[ぁ-んァ-ン一-龥0-9]+\z/, allow_blank: true } do 18 validates :lecture 19 validates :teacher 20 validates :author 21 validates :publisher 22 end 23 24 with_options numericality: { other_than: 1, message: "を選択してください"} do 25 validates :year_period_id 26 validates :sales_status_id 27 validates :scheduled_delivery_id 28 end 29 end 30end

db > migrate > 20210708035000_devise_create_users.rb

ruby

1# frozen_string_literal: true 2 3class DeviseCreateUsers < ActiveRecord::Migration[6.0] 4 def change 5 create_table :users do |t| 6 ## Database authenticatable 7 t.string :nickname, null: false 8 t.string :email, null: false, default: "" 9 t.string :encrypted_password, null: false, default: "" 10 t.integer :university_id, null: false 11 t.integer :department_id, null: false 12 t.date :birthday, null: false 13 14省略

db > migrate > 20210713000013_create_items.rb

ruby

1class CreateItems < ActiveRecord::Migration[6.0] 2 def change 3 create_table :items do |t| 4 t.string :name, null: false 5 t.integer :price, null: false 6 t.integer :year_period_id, null: false 7 t.string :lecture, null: false 8 t.string :teacher, null: false 9 t.integer :sales_status_id, null: false 10 t.integer :scheduled_delivery_id, null: false 11 t.string :author, null: false 12 t.string :publisher, null: false 13 t.references :user, null: false, foreign_key: true 14 t.timestamps 15 end 16 end 17end

試したこと

itemコントローラーのindexアクションにwhereを使用したのですが、itemテーブルにuniversity_idがない場合の書き方が分からずにいます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

孫要素の取得は

items = university.users.map{ |user| user.items}.flatten # または items = University.find(id).users.map{ |user| user.items}.flatten

みたいな感じでとれます。

ただこのままだと university.users の数分 query が走ってしまうので (N+1問題)

users = university.users.includes(:items) items = users.map { |user| user.items}.flatten

こんな感じでとれると 2回のクエリでとれます。

(university モデルに has_many :users がある前提です)

投稿2021/07/16 08:36

anozon

総合スコア662

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問