В этом приложении rails у меня есть метод, вызываемый контроллером, который принимает активное отношение записей сайтов и массив фильтров, метод возвращает любые сайты в отношении, которые имеют все фильтры в массиве. Вот метод:Получение пересечения двух активных отношений записи, рельсов
def filter_sites(sites, filters)
if filters.count > 0
filterable = sites.tag_join
filters.each { |f| sites = sites & filterable.with_tag(f) }
end
return sites
end
Вот сфера, которые используются:
def self.tag_join
joins(:tags).distinct
end
def self.with_tag(tag_id)
where('sites_tags.tag_id = ?',tag_id)
end
Это функционирует правильно, но проблема состоит в том, что он возвращает массив. Мой вопрос: есть ли более эффективный способ или написать этот метод и вернуть отношение активной записи? Как позже в коде, дальнейшие запросы должны быть скованы.
Любая помощь очень ценится.
Посмотрите на метод или метод из активной записи –
Один из способов сделать это - но это уродливый af - использовать SQL 'INTERSECT'. В основном вы создаете идентичный запрос для каждого тега, а затем 'INTERSECT'. Это ужасно, потому что вам нужно сделать это вручную, но он работает и возвращает объект ActiveRecord, который вы можете использовать. Я также должен спросить: не могли бы вы сделать 'sites.where ('sites_tags.tag_id =?', Фильтры [0]). Where ('sites_tags.tag_id =?', Filters [1]). Where (.. .) '? – henrebotha
Разве это не так безобразно? Его массив переменных длины, поэтому это должно быть записано с помощью цикла. Я бы подумал, что это рельсы для этого, его довольно общая функциональность ... – PhilBrockwell