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%"]))

Использование

Company.where(name: IN ('%apple%','%banana%'))
Другие вопросы по тегам