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

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

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

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

Ruby

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

Ruby on Rails 6

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

Q&A

解決済

1回答

973閲覧

has_many belongs_toを使って User と Postを関連付けさせたい。

atage517

総合スコア36

Ruby on Rails 5

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

Ruby

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

Ruby on Rails 6

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

0グッド

1クリップ

投稿2020/07/13 03:43

編集2020/07/13 03:47

やりたいこと

Ruby on Rails の has_many と belongs_toを使い Userのsubject要素だけをpostsで表示したい。

わからないこと

今学生版のtwitterのようなアプリを作っており、自分とおなじ学部(subject)の人だけのpostsに表示したいのですが。has_many と belongs_toを使ってもうまく表示できません。

class PostsController < ApplicationController def index @posts = Post.all.order(created_at: :desc) @posts = Post.search(params[:search]) end def index_updated_at @posts = Post.all.order(updated_at: :desc)  end def index_relative end

Userの投稿をTeratailのように 作成順(index) 更新順(index_updated_at) 関連順(index_relative)
関連順のindexでは自分とおなじ学部(subejct)の人の投稿だけを表示するのようにしたいです。

作成順 更新順は上記のコードのようにできましたが、関連順は Post model と User model の関連性を示さなければいけないですがそれのやり方がわかりません。

class Post < ApplicationRecord belongs_to :holder, class_name: 'User', foreign_key: 'user_id'
class User < ApplicationRecord has_many :posts, dependent: :destroy

上記は has_many belongs_to の関係性のmodelです。

<div class="main posts-index"> <div class="container"> <div class="posts-search"> <ul> <li><%= link_to("/posts/index") do %> <i class="fas fa-indent"> 作成順</i> <% end %> </li> <li> <%= link_to("/posts/index/updated_at") do %> <i class="fas fa-indent"> 更新順</i> <% end %></li> <li> <%= link_to("/posts/index/relative") do %> <i class="fas fa-indent"> 関連順</i> <% end %></li> </ul> </div> <br> <br> <% @posts.each do |post| %> <div class="posts-index-item"> <% if Star.find_by(post_id: post.id)%> <i class="fas fa-certificate"></i> <% end %> <%= link_to image_tag("/user_images/#{post.user.image_name}"), "/users/#{post.user.id}"%> <%= link_to(post.user.name, "/users/#{post.user.id}", {class: "text-weight"})%> <%= link_to(post.user.uni, "/#{post.user.uni}/index", {class: "text-weight"})%> <%= link_to(post.user.subject, "/#{post.user.uni}/#{post.user.subject}/index ", {class: "text-weight"})%> <p class="post-created_at"><%= time_ago_in_words post.created_at%>前</p> <br> <%= link_to(post.title.truncate(50), "/posts/#{post.id}", {class: "text-weight"})%> <br> <%= link_to(post.content.truncate(80, omission: '...もっと見る'), "/posts/#{post.id}") %> </div> <% end %> </div> </div>

上記はindex_relative.html.erbのviewです。

class CreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |t| t.string :name t.string :email t.text :uni t.text :subject t.string :image_name t.string :password t.timestamps end end end
class CreatePosts < ActiveRecord::Migration[6.0] def change create_table :posts do |t| t.text :title t.text :content t.integer :user_id t.timestamps end end end

上記はUserとPostのmigrationファイルのなかみです
どのようにしたらpostをuserモデルの関係性を示し、自分をおなじ学部(subject)のユーザーの投稿のみを表示できるようになるでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

PostにUserのテーブルをくっつけて(joinして)Userのsubjectで検索するのはどうでしょう?

@posts = Post.joins(:holder).where('user.subject' => @current_user.subject)

@current_userはログインしているUserのインスタンスを想定しています。

投稿2020/07/15 04:44

satoshih

総合スコア799

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

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

atage517

2020/07/15 07:02

satoshihさんありがとうございます! SQLite3::SQLException: no such column: user.subject satoshihさんのコードを入力したらこのエラーコードが出ました。 PostのModelには以下のような戻り値を指定しているんですが何かうまい方法はないですかね? def user return User.find_by(id: self.user_id) end やろうとしていることはPostのUser_idと繋がっているUserのSubjectを表示するということなのでそこまで複雑なコードは必要ないきもするんですけどね
satoshih

2020/07/15 07:48

> SQLite3::SQLException: no such column: user.subject 失礼タイポしてますね。 'user.subject' => 'users.subject' にしたら動かないですか? > def user > return User.find_by(id: self.user_id) > end これはそのまま belongs_to :user のことでは?
atage517

2020/07/15 09:09

無事できました!! 本当にありがとううございます!joinsなんて技があるとは知りませんでした!これからも学習に励みます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問