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

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

ただいまの
回答率

90.49%

  • Ruby

    9610questions

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

  • Ruby on Rails 5

    3305questions

  • PostgreSQL

    1386questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

[Rails5][要素の並べ替え]フォローしているユーザーの投稿のみタイムラインに表示したい。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 153

uk_63

score 17

はじめに

Rails 5.2
Ruby 2.5.0
PostgreSQl
slimを使用しています。

実現したいこと

フォローしているユーザとログインしているユーザの投稿を投稿時間で降順に一覧表示したいです。

現状

一覧表示ができていますが、
下記のようにユーザー1の投稿一覧(新しい順)⇛ユーザー2の投稿一覧(新しい順)....のようになり、うまくタイムライン表示ができません。
ユーザー1 投稿1 
ユーザー1 投稿2
ユーザー2 投稿1
ユーザー3 投稿1
ユーザー3 投稿2
ユーザー3 投稿3

モデル

user.rb

class User < ApplicationRecord

...省略...

  has_many :posts, dependent: :destroy

  has_many :active_relationships, class_name:  "Relationship",
                                foreign_key: "follower_id",
                                dependent:   :destroy
  has_many :passive_relationships, class_name:  "Relationship",
                                 foreign_key: "followed_id",
                                 dependent:   :destroy
  has_many :following, through: :active_relationships, source: :followed
  has_many :followers, through: :passive_relationships, source: :follower

  def follow(other_user)
    active_relationships.create(followed_id: other_user.id)
  end

  def unfollow(other_user)
    active_relationships.find_by(followed_id: other_user.id).destroy
  end

  def following?(other_user)
    following.include?(other_user)
  end

end

post.rb

class Post < ApplicationRecord
...省略...
  belongs_to :user
  has_many :likes, dependent: :destroy

end

relationship.rb

class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
  validates :follower_id, presence: true
  validates :followed_id, presence: true
end

うまくいっていないコード

#content_wrapper
  p.list_title タイムライン
  #post_list_wrapper
    - @users = @current_user.following
    - @users.each do |user|
      - @posts = Post.where(user_id: user.id)
      - @posts.sort_by{|post| post.created_at}.reverse
      - if @posts.present?
        - @posts.each do |post|
          = render "posts/post_index", post: post
      - else
        p.no_posts 誰かをフォローしましょう!

上記コードでは、うまく表示できませんでした。

試したコード

Teratail で似たような記事があり参考にしましたが、エラーがでました。
[Rails 5] フォローしているユーザーの投稿を表示するタイムラインを作りたい

#content_wrapper
  p.list_title タイムライン
  #post_list_wrapper
    - @users = @current_user.following
    - @users.each do |user|
      - @posts = Post.where(user_id: user.id)
      - @posts.sort_by!{|post| post.created_at}.reverse!
      - if @posts.present?
        - @posts.each do |post|
          = render "posts/post_index", post: post
      - else
        p.no_posts 誰かをフォローしましょう!
ActionView::Template::Error (undefined method `sort_by!' for #<Post::ActiveRecord_Relation:0x00007fb0aedde468>
Did you mean?  sort_by):
     6:     - @users = @current_user.following
     7:     - @users.each do |user|
     8:       - @posts = Post.where(user_id: user.id)
     9:       - @posts.sort_by!{|post| post.created_at}.reverse! #ここがエラー
    10:       - if @posts.present?
    11:         - @posts.each do |post|
    12:           = render "posts/post_index", post: post

フォローしているユーザの投稿のみを投稿時間で降順に並べ替えてタイムライン表示したい。

アドバイスをいただきたいです。
そして、なぜsort_by!がエラーなのか教えて頂きたいです。

宜しくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • matsuand

    2019/01/19 13:50

    機能ロジックが的確に説明されていませんから、正確な意図が分かりません。パッと見で回答者の皆さんは敬遠されると思いますよ。現状の一覧例にしても、投稿1って誰の投稿? ログインユーザーはどこにいるの? と疑問が湧き出て理解できません。せめて正解とお考えの一覧サンプルをお書き添えください。現状の一覧サンプルもご質問全体も見直してください。

    キャンセル

まだ回答がついていません

同じタグがついた質問を見る

  • Ruby

    9610questions

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

  • Ruby on Rails 5

    3305questions

  • PostgreSQL

    1386questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • トップ
  • Rubyに関する質問
  • [Rails5][要素の並べ替え]フォローしているユーザーの投稿のみタイムラインに表示したい。