Rails 3, HABTM как сделать запрос с условиями - PullRequest
3 голосов
/ 03 января 2012

У меня есть награды и категории, объединенные с Awards_Categories

У меня есть 2 категории.

Мне нужно найти все награды, которые имеют Category.id = 1, но не Category.id =2.Некоторые категории имеют одну или другую, некоторые имеют только одну.Мне нужен список наград, которые имеют категорию 1, но не категорию 2.

У меня есть область действия:

scope :in_categories, lambda { |categories|
      joins(:categories).
      where(:awards_categories => { :category_id => categories } ).
      select("DISTINCT awards.*")
    }

И это работает с запросом, подобным:

@awardsall = Award.in_categories([1 && 2]).order("name ASC") 

Я пробовал

@awards_store = Award.in_categories([1]).order("name ASC") 

С:

<% @awards_store.each do |store| %> 
        <li><%= link_to store.name, award_path(store), :title => store.info %> | 
        <% store.categories.each do |cat| %>
            <%= cat.id%>
        <% end %>
    </li>
<% end %>

РЕДАКТИРОВАТЬ --- Я знаю, что блок не то, что мне нужно.это просто моя попытка найти способ заставить его работать.

И хотя в нем перечислены все награды и все категории наград, это все еще захватывающие награды, которые имеют category.id = 2, потому что некоторые награды имеют обе

есть идеи?

1 Ответ

2 голосов
/ 04 января 2012

Извините, не проверял, но основная идея - подсчитать строки в соединительной таблице.

scope :in_categories, lambda { |*categories|
      joins(:categories).
      where(:awards_categories => { :category_id => categories } ).
      where("(select count(distinct category_id) from awards_categories where category_id in (?)) = ?", categories, categories.size)
    }

и использовать это так:

@awardsall = Award.in_categories(1, 2).order("name ASC") 

@awards_store = Award.in_categories(1).order("name ASC") 

Еслиу вас есть модель для awards_categories, тогда она будет выглядеть лучше:

scope :in_categories, lambda { |*categories|
      joins(:categories).
      where(:awards_categories => { :category_id => categories } ).
      where("#{AwardCategory.where(:category_id => categories).count("distinct category_id").to_sql}=#{categories.size}")
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...