10674


メモ(`Memo`)一覧には id, name, urlが表示されており、  
その`url`を検索する画面を作っております。

|ID|メモ名|URL|  
|---|-------|-----|  
| 1| AAA| <http://google.com> |  
| 2| BBB| <http://yahoo.co.jp> |  
| 3| CCC| <http://facebook.com> |

`url`を検索する際 毎回の検索文字列入力を簡略化するため、  
検索グループ(`SearchGroup`)とそれに紐付いた検索グループURL(`SearchGroupUrl`)を定義してあります。

[code]

    class Memo < ActiveRecord::Base
    # name, string
    # url, string
    end
    
    class SearchGroup < ActiveRecord::Base
      has_many :search_group_urls, inverse_of: :search_group, :dependent => :destroy
      accepts_nested_attributes_for :search_group_urls, :allow_destroy => true, :reject_if => :all_blank
    
    # name, string
    end
    
    class SearchGroupUrl < ActiveRecord::Base
      belongs_to :search_group, inverse_of: :search_group_urls
    
    # search_group_id, refference
    # url, string
    end
    
[/code]

# データ中身

[code]

    $ SearchGroup.all
    -> #<ActiveRecord::Relation [#<SearchGroup id: 1, name: "GoogleとYahoo">]
    
    $ SearchGroupUrl.all
    -> #<ActiveRecord::Relation [#<SearchGroupUrl id: 1, search_group_id: 1, url: "google">, #<SearchGroupUrl id: 2, search_group_id: 1, url: "yahoo">]
    
[/code]

# View

[code]

    <%= form_tag (search_***_path) method: :get do %>
      ~~~ 検索部分 ~~~
      <div>
        <%= select_tag "search[search_group]", options_for_select(get_search_group), :class => "form-control input-sm" %>
      </div
      ~~~ 表示部分 ~~~
    <% end %>
    
[/code]

# Helper

[code]

    def get_search_group
      search_group_hash = {"全て" => ""}
      return search_group_hash if SearchGroup.all.blank?
      results = SearchGroup.all.map{|search_group| [search_group.name,   search_group.search_group_urls.map{|url| [url.url]}]}
      Hash[results]
    end
    
[/code]

ここで問題なのは、Controllerでこの`get_search_group`メソッドから取得した型がString型であるためうまく `Where
in`の形で検索できないことです。

# Controller

[code]

    query = Memo.readonly
    query = query.where(arel_table[:url].matches(search_params[:search_group]))
    
[/code]

## 中身

[code]

    $ search_params[:search_group]
    => "[[\"google\"], [\"yahoo\"]]"
    
    $ search_params[:search_group].class
    => String
    
[/code]

複数文字列を効率よく検索するクエリの組み立て方を知りたいです｡  
(予期する結果は 'google' と 'yahoo'が含まれるレコード2件が結果表示されることです)


CC BY-SA 3.0
2015-05-27T07:18:06.277
10671
2015-05-27T07:37:36.403
9177
question
ruby-on-rails ruby rails-activerecord
ActiveRecord 受け取った文字列を効率よく検索する方法


この場合コントローラーへ渡されるべきデータは、SearchGroupを特定する識別子であって、検索すべき文字列ではありません。  
例えばSearchGroupのID値さえ渡せばSearchGroupUrl.where(search_group_id:
...)で配列取得できますからクエリパラメータの文字列で悩んだりせず処理できます。


CC BY-SA 3.0
2015-05-27T07:37:36.403
10674
2015-05-27T07:37:36.403
8335
10671
answer