5

我想联合多个活动记录关系

例如,

apple_companies = Company.where("name like ?","%apple%")
banana_companies = Company.where("name like ?","%banana%")

我想结合这两种关系。

不合并,合并是 apple_companies.merge(banana_companies) => Company.where("name like ? and name like ?", "%apple%","%banana%")

我想 Company.where("name like ? or name like ?", "%apple%","%banana%")

之后,

我会编码

companies = Company.none
company_name_list.each do |name|
    like = "%"+name+"%"
    companies += Company.where("name like ?",like)
end

但是我写的代码使公司排列起来......

所以我不能向公司订购和寻呼...... :(

谢谢你

4

6 回答 6

5
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 条件

于 2014-04-28T13:55:54.607 回答
4

我遇到的最好的结果是抓取并合并两个查询的 id,然后像这样搜索它们:

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)

这四行似乎应该合二为一,但它确实有效。

于 2016-10-06T19:39:58.267 回答
2

在这种情况下,您可以使用任何其他答案。但是在更一般的情况下,我强烈建议使用any_ofgem。有了这个宝石,您可以:

apple_companies = Company.where("name like ?","%apple%")
banana_companies = Company.where("name like ?","%banana%")

Company.where.any_of(apple_companies, banana_companies)

已经有一个请求请求将此功能添加到未来的 Rails 版本中。

于 2014-04-28T09:01:35.663 回答
1

请尝试使用

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)
于 2014-04-28T08:53:09.323 回答
0

迟到的答案,但Arel会解决它。

Company.where(Company.arel_table[:name].matches_any(["%apple%", "%banana%"]))
于 2017-03-10T22:22:17.600 回答
-1

利用

Company.where(name: IN ('%apple%','%banana%'))
于 2014-04-28T08:50:01.677 回答