ActiveRecord 受け取った文字列を効率よく検索する方法
メモ(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
)を定義してあります。
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
データ中身
$ 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">]
View
<%= 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 %>
Helper
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
ここで問題なのは、Controllerでこのget_search_group
メソッドから取得した型がString型であるためうまく Where in
の形で検索できないことです。
Controller
query = Memo.readonly
query = query.where(arel_table[:url].matches(search_params[:search_group]))
中身
$ search_params[:search_group]
=> "[[\"google\"], [\"yahoo\"]]"
$ search_params[:search_group].class
=> String
複数文字列を効率よく検索するクエリの組み立て方を知りたいです。
(予期する結果は 'google' と 'yahoo'が含まれるレコード2件が結果表示されることです)