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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

Q&A

解決済

1回答

359閲覧

フォロー中のユーザーの全ツイートを新しい順に表示

shawn_709

総合スコア13

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

0グッド

1クリップ

投稿2020/12/08 05:31

ご回答いただけるとありがたいです。よろしくお願いします!

実現したいこと

フォロー中のユーザーの全ツイートを新しい順にトップページに表示したいです。

現状

フォロー中のユーザーの全ツイートをトップページに表示させることはできていますが、順番がユーザー登録の順番です。
例えば
1、User1がtweet1を投稿
2、User2がtweet2を投稿
3、User1がtweet3を投稿

1から3の順で投稿していても、表示される順は上から
2、User2がtweet2を投稿
3、User1がtweet3を投稿
1、User1がtweet1を投稿
になります。

該当のソースコード

model

1#relationship 2class Relationship < ApplicationRecord 3 belongs_to :user 4 belongs_to :follow, class_name: 'User' 5 6 validates :user_id, presence: true 7 validates :follow_id, presence: true 8end 9 10#tweet 11class Tweet < ApplicationRecord 12 belongs_to :group 13 belongs_to :user 14 has_one_attached :image 15 16 validates :content, presence: true, unless: :was_attached? 17 18 def was_attached? 19 self.image.attached? 20 end 21end 22 23#user 24class User < ApplicationRecord 25 devise :database_authenticatable, :registerable, 26 :recoverable, :rememberable, :validatable 27 28 validates :nickname, presence: true 29 30 has_many :group_users 31 has_many :groups, through: :group_users 32 has_many :tweets 33 has_many :owned_groups, class_name: "Group" 34 35 has_many :relationships 36 has_many :followings, through: :relationships, source: :follow 37 has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: 'follow_id' 38 has_many :followers, through: :reverse_of_relationships, source: :user 39 40 def follow(other_user) 41 unless self == other_user 42 self.relationships.find_or_create_by(follow_id: other_user.id) 43 end 44 end 45 46 def unfollow(other_user) 47 relationship = self.relationships.find_by(follow_id: other_user.id) 48 relationship.destroy if relationship 49 end 50 51 def following?(other_user) 52 self.followings.include?(other_user) 53 end 54 55end

controller

1#relationships 2class RelationshipsController < ApplicationController 3 before_action :set_user, only: [:create, :destroy] 4 5 def index 6 @followings = current_user.try(:followings) 7 end 8 9 def create 10 following = current_user.follow(@user) 11 following.save 12 redirect_to @user 13 end 14 15 def destroy 16 following = current_user.unfollow(@user) 17 following.destroy 18 redirect_to @user 19 end 20 21 def following 22 @user = User.find(params[:id]) 23 @followings = @user.followings 24 end 25 26 def follower 27 @user = User.find(params[:id]) 28 @followers = @user.followers 29 end 30 31 private 32 33 def set_user 34 @user = User.find(params[:follow_id]) 35 end 36 37end

view

1#relationships#index 2(省略) 3<% @followings.each do |following| %> 4 <% following.tweets.order("created_at DESC").each do |tweet| %> 5 <div class="tweet"> 6(省略)

###試したこと

controller

1#relationships 2 def index 3 @followings = current_user.try(:followings).order("created_at DESC") 4 end

同じ結果になる + ログアウトしたら以下のエラーが出る

Error

1NoMethodError in RelationshipsController#index 2undefined method `order' for nil:NilClass

以上になります。ご助言いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

tweet に user_id カラムがあり、current_user.followings で絞り込めるから

ruby

1followings = current_user.followings 2@tweets = Tweet.where(user: followings).order(created_at: "desc")

関連付けて取得する方法

ruby

1user.rb 2has_many :timeline, :through => :followings, source: "tweets" 3 4controller 5@tweets = current_user.timeline.order(created_at: "desc")

下のは何となく書いたら出来ました。どういう理屈で動くのかは説明できません。
小さいサンプルで確認しているので、間違ってたらすみません。

どちらも結果としては同じですが、実行するSQLが異なります。
データ量(や多分MySQLの設定でも)で変わってくるのでどちらが優れているとは言えません。

投稿2020/12/08 13:24

neko_daisuki

総合スコア2090

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

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

shawn_709

2020/12/08 13:36

本当に毎回ありがとうございます!感謝しても感謝しきれません。 上の方で実装したら、いけました!ありがとうございます! また、小さいサンプルまでわざわざ用意して確認してくださり、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問