рельсы: получить элементы, связанные с несколькими заданными тегами - PullRequest
1 голос
/ 17 ноября 2010

нуб вопрос тут. У меня есть has_many: через отношения между элементами и тегами. Найти все элементы, связанные с данным тегом, достаточно просто:

things=Tag.find(1).items

Но что, если я хочу найти все элементы, связанные с несколькими тегами? Я думал что-то вроде:

things=Tag.find(1).items
Tag.find(2).things # wrong, but you get the idea

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Вы можете использовать оператор объединения массивов.

things = Tag.find(1).items | Tag.find(2).items

Это создаст объект для каждого элемента для обоих тегов, что может быть слишком много в зависимости от того, что вы пытаетесь сделать. Если вам нужно что-то более масштабируемое, вы можете выполнить поиск в таблице соединений.

things = ItemTags.find_by_sql("
  SELECT item_id, COUNT(tag_id) AS tag_count 
  FROM item_tags
  WHERE tag_id IN (1, 2)
  GROUP_BY item_id
  HAVING tag_count = 2;
").map(&:item)

Только что написал это в браузере, так что это может быть совершенно неправильно. Кроме того, вероятно, есть способ сделать это с помощью поиска активных записей, который был бы лучше, чем find_by_sql.

0 голосов
/ 17 ноября 2010
things = Things.where(:tag => [1, 2])
things = Things.where('tag in :tags', [1, 2])

и т.д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...