Написание именованной области в рельсах - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть три модели: продукты, места размещения, коллекции

Я пытаюсь написать область имен, которая выбирает только продукты, НЕ входящие в определенную коллекцию.

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

Есть идеи, как написать это, чтобы выбрать только продукты, не входящие в эту конкретную коллекцию?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2011

Названная область видимости становилась слишком уродливой, поэтому я пошел с этим.Не уверен, что это лучший способ, но он работает ...

  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 голосов
/ 16 декабря 2011

Вместо collections.id IS NOT 4 попробуйте collections.id != 4

...