2017-10-03 12 views
0

私はフロントエンドにオートコンプリートフォームを持っています。私がやりたいことは、複数のモデルにまたがって検索を行い、結果を組み合わせて返すことです。私が読んだすべての関連記事は、関連性のあるモデルに関するものです。ここに私のスキーマの簡易版でチラッです:私はcountriesisobookscountry_codejoin試してみたRails:関連付けなしで複数のモデルを検索する

create_table "countries", force: :cascade do |t| 
    t.string "iso" 
    t.string "name" 
    end 

    create_table "cities", force: :cascade do |t| 
    t.string "name" 
    end 

    create_table "books", force: :cascade do |t| 
    t.string "country_code" 
    end 

は、それはまだcitiesを残します。私もこれを試してみました:Book.where("name ILIKE ?", "%term%") + Country.where("name ILIKE ?", "%term%") + City.where("name ILIKE ?", "%term%")しかし、それはActiveRecord :: Relationではない配列を返しますので、必要以上の検索につながる制限は使用できません(オートコンプリートには5つの結果しか必要ありません)。これをやり遂げるにはどうすればいいですか?役立つなら、私はPostgreSQLを使っています。

編集:私はpg_search宝石を使用して終了し、それはうまくいくようです!

答えて

1

あなたは以下のように変更して上記のクエリと罰金する必要があります:私はActiveRecord::QueryMethod#limitと同じように同じ目的を達成するArray#take方法を使用してい

search_limit = 5 

search_results = (Book.where("name ILIKE ?", "%term%").limit(search_limit) + 
        Country.where("name ILIKE ?", "%term%").limit(search_limit) + 
        City.where("name ILIKE ?", "%term%").limit(search_limit) 
       ).take(search_limit) 

1

あなたが探しているものは組合です。

ActiveRecordを使用する代わりに、MySQL(https://thepugautomatic.com/2014/08/union-with-active-record)で記述する必要があります。それでもActiveRecordを使用する場合は、active_record_union gemを使用できます。次に、コードを次のように変更します。

Book.select('name'). 
    union(Country.select('name')). 
    union(City.select('name')). 
    where("name ILIKE ?", "%term%") 
関連する問題