Поисковая модель, у которой есть_and_belongs_to_many: теги - PullRequest
2 голосов
/ 01 марта 2012

Мне нужна небольшая помощь с Rails. Я перевожу бэкэнд-систему поиска данных из PHP в RoR. Что я нахожу на удивление кратким.

Мне нужно иметь возможность искать модель на предмет ее связи с моделью тега. Каждой модели присвоена ассоциация has_and_belongs_to_many.

Когда поиск передается с помощью списка значений, разделенных запятыми, мне нужно выполнить поиск «И» по тегам, чтобы я мог найти все ресурсы, которым были переданы все теги (т. Е. Мосты Лондон и И).

Также необходимо учитывать регистр символов. В настоящее время в модели ресурсов выполняется только один поиск по тегу.

def self.search(search)
    where('LOWER(tags.name) = ?', search.downcase).joins(:tags)
end

Все мои попытки использовать массив с помощью where, find или all не увенчались успехом.

PHP-способ поиска AND в таблице соединений казался довольно хакерским, я надеюсь, что Rails сможет предложить более элегантное решение.

Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 01 марта 2012

Если вам нужен AND, то вам нужно убедиться, что количество совпадающих тегов - это именно то количество, которое вы запрашивали, так что это также включает COUNT.Запрашиваемый вами запрос будет включать IN.

Было бы удобнее, если бы вы могли гарантировать, что ваши теги всегда хранятся в нижнем регистре.Выполнение таких операций, как LOWER(...), в запросе будет проблематичным, если у вас много данных, поскольку это приводит к автоматическому сканированию таблицы и не может быть проиндексировано.

Во-вторых, я бы избегал использования has_and_belongs_to_manyпоскольку это пережиток Rails 1.0 дней, который не такой гибкий и надежный, как альтернатива has_many :through.Единственное различие между этими двумя подходами с точки зрения базы данных состоит в том, что таблица соединения :through имеет уникальный идентификатор для каждой записи и представлена ​​моделью первого класса.* * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * *1014* * * * * * * * * * * *1014* То, что вы, вероятно, хотите, выглядит как-то так:Эксперимент, чтобы получить правильное поведение.Ваш пример не был таким конкретным.

...