2011-12-16 4 views
0

제품, 게재 위치, 컬렉션의 세 가지 모델이 있습니다.레일에 명명 된 범위 작성

특정 컬렉션에만없는 제품을 선택하는 이름 범위를 작성하려고합니다.

products has_many :collections, :through => :placements

collections has_many :products, :through => :placements

나는 지금까지 이것에 대해 가지고 :

scope :not_in_front, joins(:collections).where('collections.id IS NOT ?', 4) 

그러나 내가 쿼리에서 예상과 반대 생성 :

Product Load (0.3ms) SELECT "products".* FROM "products" INNER JOIN "placements" ON "products"."id" = "placements"."product_id" WHERE "placements"."collection_id" = 4 

어떤 생각 방법을 이 제품을 쓰려면 내가 아닌 제품만을 선택하십시오. 그 특별한 컬렉션? 대신 collections.id IS NOT 4

답변

0

을 시도, 그래서 나는이와 함께 갔다. 최선의 방법인지는 모르겠지만 작동합니다 ...

def self.not_on_top_shelf 
    top_shelf = Collection.find_by_handle('top-shelf') 
    products = Product.find(:all, :order => "factor_score DESC") 
    not_on_top_shelf = products.map {|p| p unless p.collections.include?(top_shelf)} 
    not_on_top_shelf.compact #some products may not be in a collection 
    end 
0

은 명명 된 범위가 너무 못생긴지고 있다고 collections.id != 4

+0

나는 이미 ... 동일한 쿼리를 사용했습니다. – Slick23