Переместить метод из контроллера в модель в Rails - PullRequest
0 голосов
/ 09 марта 2020

Мне сказали переместить метод "Top" из контроллера в модель, но когда я пытаюсь вызвать его, он больше не работает.

Я использую Rails 6

Это мой контроллер:

class UsersController < ApplicationController
  before_action :authenticate_user!

  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
    @posts = @user.posts.ordered_by_most_recent
  end

  def edit
    @user = User.find(params[:id])
  end

  def following
    @title = 'Following'
    @user = User.find(params[:id])
    @users = @user.following.paginate(page: params[:page])
    render 'show_follow'
  end

  def followers
    @title = 'Followers'
    @user = User.find(params[:id])
    @users = @user.followers.paginate(page: params[:page])
    render 'show_follow'
  end

  def top
    @userst = User.joins(:followers).order('COUNT(followings.follower_id) DESC').group('users.id').limit(10)
  end
end

и это будет моя модель:

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, authentication_keys: [:username]

  validates :fullname, presence: true, length: { maximum: 20 }
  validates :username, presence: true, length: { maximum: 20 }

  validates_uniqueness_of :username

  has_many :posts
  has_many :active_followings, class_name: 'Following',
                               foreign_key: 'follower_id',
                               dependent: :destroy
  has_many :passive_followings, class_name: 'Following',
                                foreign_key: 'followed_id',
                                dependent: :destroy
  has_many :following, through: :active_followings, source: :followed
  has_many :followers, through: :passive_followings, source: :follower

  mount_uploader :photo, FileUploader
  mount_uploader :coverimage, FileUploader

  # Follows a user.
  def follow(other_user)
    following << other_user
  end

  # Unfollows a user.
  def unfollow(other_user)
    following.delete(other_user)
  end

  # Returns true if the current user is following the other user.
  def following?(other_user)
    following.include?(other_user)
  end

end

Весь код здесь имеет смысл для меня, поэтому мне нужно было только создать файл с именем top. html .erb вот так для рендеринга Top:

  <article class="timeline new-initial">
    <h3>Top:</h3>
    <ul class="posts">
      <%= render @userst %>
    </ul>
  </article>

Теперь, если честно, я заблудился, я не уверен, как правильно перенести этот метод в модель User для чтения это в разделе просмотра.

1 Ответ

0 голосов
/ 09 марта 2020

Это похоже на работу для объема .

Модель:

scope :top, -> { joins(:followers).order('COUNT(followings.follower_id) DESC').group('users.id').limit(10) }

Контроллер:

def top
    @userst = User.top
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...