Результаты поиска заказов Rails - PullRequest
0 голосов
/ 25 апреля 2020

У меня проблема с упорядочением результатов поиска по рельсам. Я хочу заказать посты после того, как искал или фильтровал, но то, что я делаю, похоже, не работает. Вот мой код.

posts_controller.rb

display
  @posts = Post.where("user_id IN (?)", current_user.following_ids)
  @posts = @posts.find(Like.group(:post_id).pluck(:post_id)).order(params[:change]) if params[:change].present?
end

У меня есть posts_controller, который отображает записи, за которыми следит пользователь, он работает нормально. Однако, когда я добавил дополнительный код, пытаясь упорядочить посты по количеству лайков, произошла ошибка. Кажется, что вторая строка в пост-контроллере извлекает все посты с лайками, а не только посты, за которыми следит пользователь. Если я заменю @ posts.find на Post.find, все результаты постов будут показаны и упорядочены по количеству лайков.

кстати, этот @ posts.order (создал_кат :: des c) работает нормально. Он заказывает только сообщения, за которыми следит пользователь.

like.rb

class Like < ApplicationRecord
  belongs_to :post, foreign_key: "post_id"
  belongs_to :user
  validates_uniqueness_of :post_id, scope: :user_id
end

like_controller.rb

class LikesController < ApplicationController

def create
  @like = current_user.likes.create(post_id: params[:post_id])
redirect_back(fallback_location: root_path)
end

def destroy
  @like = Like.find_by(post_id: params[:post_id], user_id: current_user.id)
  @like.destroy
redirect_back(fallback_location: root_path)
end

end

Я очень новичок в программировании, поэтому, пожалуйста, прости меня если я задаю глупый вопрос. Спасибо всем большое.

Сообщение об ошибке ниже:

enter image description here

1 Ответ

1 голос
/ 25 апреля 2020

Обратите внимание, что find при задании массива требует наличия всех идентификаторов в массиве, иначе вы получите ошибку. В документации говорится:

Если для запрошенных идентификаторов не может быть найдена одна или несколько записей, будет вызвано RecordNotFound.

Я бы использовал другой механизм для извлечения записей:

@posts = @posts.where(id: Like.group(:post_id).pluck(:post_id)).
              order(params[:change]) if params[:change].present?

Это позволит найти только те записи, которые удовлетворяют условию.

Это кажется немного неуклюжим. Может быть более чистый способ получения этого результата в зависимости от того, какие отношения могут существовать в ваших моделях между Like, Post и Group.

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