2015-12-10 4 views
0

Мы создаем видео-раздел для наших пользователей. Пользователь может фильтровать видео по рейтингу/просмотров/дате. Также пользователь может решить скрыть уже увиденные видео. Здесь я немного боюсь.Лучший способ фильтрации невидимых видео в Rails

прямо сейчас у меня есть решение, которое работает, но, похоже, отлично работает.

if @filter == "newest" 
    if @unseen 
    ids = Videothek::Video.where(videothek_category_id: categories).pluck(:id) 
    views = Videothek::Video::View.where(user_id: current_user.id).pluck(:video_id) 
    unseen = ids - views #ids der ungesehenen videos 
    @videos = Videothek::Video.where(id: unseen).order("created_at DESC") 
    else 
    @videos = Videothek::Video.where(videothek_category_id: categories).order("created_at DESC") 
    end 
end 

я подумал, что это должно быть возможно сделать с областью, как Videothek::Video.unseen(current_user).order(.....)

Video has_many Views, но я изо всех сил, чтобы получить присоединиться к бежать, а я просто хочу видео, что не имею ассоциация с видеотелеком_видео_вью, где user_id = 1 (или current_user.id).

Может ли кто-нибудь помочь мне?

кстати: мы на RoR3

ответ

1

Вы можете использовать where.not (video_id: [Идентификаторы]), чтобы сделать фильтр базы данных видео пользователя уже видели. Этот метод добавляется, так как рельсы 4.

https://robots.thoughtbot.com/activerecords-wherenot

вместо срывать (: идентификатор), вы можете использовать .ids. Я бы также переместил код из контроллера.

Возможно, у вас вопрос будет соответствовать https://codereview.stackexchange.com/, так как у вас уже есть рабочая версия.

+0

Извините, забыли сказать, что мы находимся на рейках 3. –

+0

, так что бы вы сказали, что это правильный путь, чтобы получить список ВСЕХ просмотренных видеороликов, а затем вывести их из результата? –

+0

, так что я запускаю область действия Videothek :: Video :: View.where (user_id: user.id) .pluck (: video_id) 'и использует в области действия where' where ("id NOT IN (# {seen.join (',')}) ") ', который дает мне тогда '=>" SELECT 'videothek_videos. * FROM'videothek_videos ГДЕ (id NOT IN (1,2,3,4,5,25,26,27) , 29)) "' первый взгляд: рабочий. второй взгляд: SQL может получить huuuuuuuge (после 4.000 просмотров видео?), не проблема для моего mysql? –