Rails结合了多个activerecord关系

use*_*287 5 ruby ruby-on-rails-4 rails-activerecord activerecord-relation

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

例如,

apple_companies = Company.where("name like ?","%apple%")
banana_companies = Company.where("name like ?","%banana%")
Run Code Online (Sandbox Code Playgroud)

我想结合这两种关系.

不合并,合并是apple_companies.merge(banana_companies)=> Company.where("名称像?和名字一样?","%apple%","%banana%")

我想要Company.where("名字喜欢?或名字喜欢?","%apple%","%banana%")

之后,

我会编码

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

但是我写的代码使公司成为阵列......

所以我不能订购和页面公司...... :(

谢谢

Jas*_*ble 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))
Run Code Online (Sandbox Code Playgroud)

有关更多示例,请参见ActiveRecord Arel OR条件


小智 5

我遇到的最好结果是获取并合并两个查询的 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)
Run Code Online (Sandbox Code Playgroud)

这是四行,看起来应该可以在一行中完成,但它确实有效。


Bab*_*bar -1

使用

Company.where(name: IN ('%apple%','%banana%'))
Run Code Online (Sandbox Code Playgroud)