Я пытаюсь реализовать запрос, когда текущий пользователь видит только проекты, которые он / она не просматривал. Обзор является более или менее системой «сдал / не сдал», а не письменным заявлением. Отзыв не существует, пока пользователь не создаст его.
Проекты имеют внешний ключ пользователя, а обзоры имеют внешний ключ пользователя и проекта.
class User < ApplicationRecord
has_many :projects, dependent: :destroy
has_many :reviews, through: :projects, dependent: :destroy
end
class Review < ApplicationRecord
belongs_to :user
belongs_to :project
end
class Project < ApplicationRecord
belongs_to :user
has_many :reviews, dependent: :destroy
end
Выходные данные отправляются в базовый элемент <% @ feed.each do | item | Цикл%> <% end%>.
Предыдущие попытки:
@feed = Project.where("id NOT IN (SELECT DISTINCT(project_id) FROM reviews)").where("#{current_user.id} IN (SELECT user_id FROM reviews)")
Вывод, который я пытаюсь получить, заключается в запросе всех записей проекта, где запись не принадлежит текущему пользователю и не была просмотрена текущим пользователем.
EDIT:
После долгих размышлений и исследований я думаю, что нашел решение.
@feed = Project.where("NOT EXISTS (SELECT * FROM reviews WHERE reviews.project_id = projects.id AND reviews.user_id = #{current_user.id})")
Я пробовал это сделать в двух тестовых аккаунтах, один с отзывами, а другой ни с одним Вернулось правильное количество для обоих, я все еще открыт для понимания того, подходит ли этот запрос.