Rails объединяет несколько отношений activerecord
Я хочу объединить несколько активных отношений записи
Например,
apple_companies = Company.where("name like ?","%apple%")
banana_companies = Company.where("name like ?","%banana%")
Я хочу совместить эти два отношения.
не слияние, слияние - это apple_companies.merge(banana_companies) => Company.where("имя как? и имя как?", "%apple%","%banana%")
Я хочу, чтобы Company.where("name like? Или name like?", "% Apple%", "% banana%")
после этого,
Я буду кодировать
companies = Company.none
company_name_list.each do |name|
like = "%"+name+"%"
companies += Company.where("name like ?",like)
end
но код, который я написал, заставляет компании создавать массивы.....
Поэтому я не могу заказать и страницу компании...:(
благодарю вас
6 ответов
Лучший результат, с которым я столкнулся, - это получить и объединить идентификаторы двух запросов, а затем искать их следующим образом:
apple_companies = Company.where("name like ?","%apple%").pluck(:id)
banana_companies = Company.where("name like ?","%banana%").pluck(:id)
ids = apple_companies + banana_companies.uniq
Company.where(id: ids)
Это четыре строки, которые, кажется, должны быть выполнимы в одной, но это работает.
apple_companies = Company.where("name like ?","%apple%")
banana_companies = Company.where("name like ?","%banana%")
apples = apple_companies.where_values.reduce(:and)
bananas = banana_companies.where_values.reduce(:and)
Company.where(apples.or(bananas))
Посмотрите условие ActiveRecord Arel OR для большего количества примеров.
В этом случае вы можете использовать любой другой ответ. Однако в более общих случаях я настоятельно рекомендую использовать any_of
драгоценный камень. С этим драгоценным камнем вы можете сделать:
apple_companies = Company.where("name like ?","%apple%")
banana_companies = Company.where("name like ?","%banana%")
Company.where.any_of(apple_companies, banana_companies)
Уже есть запрос на добавление, чтобы добавить эту функциональность в будущих выпусках рельсов.
Пожалуйста, попробуйте использовать
Company.where('name LIKE ? OR name LIKE ?','%apple%', '%banana%')
ИЛИ ЖЕ
Company.where('name IN (?)', ['%apple%', '%banana%'])
Согласно вашему коду:
names = []
company_name_list.each do |name|
names << "%"+name+"%"
end
Тогда вы можете сделать:
companies = Company.where('name LIKE ANY(Array[?])', names)
Поздний ответ, но Arel
решит это.
Company.where(Company.arel_table[:name].matches_any(["%apple%", "%banana%"]))