2016-07-22 10 views
3

В этом приложении 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 

Это функционирует правильно, но проблема состоит в том, что он возвращает массив. Мой вопрос: есть ли более эффективный способ или написать этот метод и вернуть отношение активной записи? Как позже в коде, дальнейшие запросы должны быть скованы.

Любая помощь очень ценится.

+0

Посмотрите на метод или метод из активной записи –

+1

Один из способов сделать это - но это уродливый af - использовать SQL 'INTERSECT'. В основном вы создаете идентичный запрос для каждого тега, а затем 'INTERSECT'. Это ужасно, потому что вам нужно сделать это вручную, но он работает и возвращает объект ActiveRecord, который вы можете использовать. Я также должен спросить: не могли бы вы сделать 'sites.where ('sites_tags.tag_id =?', Фильтры [0]). Where ('sites_tags.tag_id =?', Filters [1]). Where (.. .) '? – henrebotha

+0

Разве это не так безобразно? Его массив переменных длины, поэтому это должно быть записано с помощью цикла. Я бы подумал, что это рельсы для этого, его довольно общая функциональность ... – PhilBrockwell

ответ

1

Вы можете сделать merge. Возвращается array, но это чистый вызов, удобный и простой в обслуживании.

 Смежные вопросы

  • Нет связанных вопросов^_^