2016-08-31 7 views
1

私はこれらのパラメータでビデオを取得しようとしています。しかし、それでも私は何の誤りもありません。私はまだカテゴリ[17]のビデオをいくつか手に入れています。 私はこれらのパラメータですべてのビデオを取得しようとしています

  • は休閑カテゴリ
  • [15,17,26,32,35,36,37]のいずれかの時間を持っていない長いその後、100
  • 彼らは

Video.rb

class Video < ActiveRecord::Base 
    self.primary_key = "id" 
    has_and_belongs_to_many :categories 
end 

カテゴリーユニークです。 rb

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :videos 
end 

私のクエリは

@excluded_categories = [15,17,26,32,35,36,37] 

    @videos = Video.joins(:categories).where("duration >= 100").where.not(categories: { id: @excluded_categories }).pluck(:video_id).uniq 

どのようにこのクエリを記述方法を書くための良い方法はありますか?

+0

たとえば、 'rails console'でクエリを実行すると、それは実行されるSQLとしてどのように表示されますか? – ollpu

答えて

0

これは非常に一般的なSQLのケースです。「特定の関係を持たないオブジェクトのリストを取得します」。

これらの場合の唯一の解決策は、「特定の関係を持つオブジェクトのリストにないオブジェクトのリストを取得する」で文を変換することです。

あなたは、これらのカテゴリのいずれかを持つ動画のリストに含まれていないすべての動画を抽出する必要があります。 SQLで

のActiveRecordに換算
select videos.* 
from videos 
where videos.id not in (select v2.id 
         from videos v2 
         join categories_videos cv on cv.video_id == v2.id 
         join categories c on cv.category_id == c.id 
         where c.id in '15,17,26,32,35,36,37') 

あなたが持っているでしょう:

class Video < ActiveRecord::Base 
    self.primary_key = :id 
    has_and_belongs_to_many :categories 
    scope with_categories: ->(ids) { joins(:categories).where(categories: {id: ids}) } 

    scope without_categories: ->(ids) { where.not(id: with_categories(ids) } 
end 

ので、最後に...

@excluded_categories = [15,17,26,32,35,36,37] 
@videos = Video.without_categories(@excluded_categories) 

P.S.を

カテゴリがない動画は検索されないため、この例では問題が発生しています。

+0

ありがとうございます。私はカテゴリーなしでvidsを披露することは気にしない、私はそれを望んでいない。 –

+0

また、あなたの答えに構文エラーがあります。 'with_categories'スコープの最後に'} 'がありません。それ以外の場合はお手数ですが、 –

関連する問題