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

私が遭遇したこれに対する最良の結果は、2 つのクエリの 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)

1つで実行できるように見えるのは4行ですが、機能します。

于 2016-10-06T19:39:58.267 に答える
2

この場合、他の回答を使用できます。any_ofただし、より一般的なケースでは、 gem の使用を強くお勧めします。この宝石を使用すると、次のことができます。

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 に答える