Rails-сохранение запроса на обыск для последующего использования
Я успешно установил Ransack gem и он работает в моем приложении как для простого, так и для расширенного поиска. Я пытаюсь добавить функцию для пользователей, чтобы "сохранить Поиск". По сути, идея заключается в том, что они могут добавить поисковый запрос в закладки и получить к нему доступ позже в любое время.
Я настроил его, создав модель SavedSearch. Когда пользователь сохраняет поиск, он берет params [: q] из своего поиска ransack и сохраняет его в базе данных.
Позже я извлекаю эту запись из базы данных, и откройте запрос. Я пытаюсь воссоздать поиск, передавая запрос в ransack, но он, кажется, не работает. Поиск извлекает все записи для этой модели, а не только те, которые соответствуют запросу. Есть идеи, почему? Я думаю, что, возможно, параметры поиска нужно изменить на другой формат, прежде чем передавать их обратно в ransack? Вот мой код:
Вот код из моей модели контроллера (advanced_search действие работает безупречно, но saved_search не фильтрует правильно при повторной обработке запроса):
def advanced_search
@query = params[:q]
@saved_search = SavedSearch.new
@q = Variant.search(params[:q])
@q.build_grouping unless @q.groupings.any?
@variants = params[:distinct].to_i.zero? ?
@q.result.paginate(per_page: 100, page: params[:page]) :
@q.result.includes(:supplier).paginate(per_page: 100, page: params[:page])
respond_with @variants
end
def saved_search
@id = params[:id]
@saved_search = SavedSearch.find(@id)
@query = @saved_search.query_parameters
@distinct = @saved_search.distinct
@q = Variant.search(@saved_search.query_parameters)
@q.build_grouping unless @q.groupings.any?
@variants = @distinct.to_i.zero? ?
@q.result.paginate(per_page: 100, page: params[:page]) :
@q.result.includes(:supplier).paginate(per_page: 100, page: params[:page])
render 'advanced_search'
end
Вот как выглядят параметры поиска из успешного запроса, когда они хранятся в базе данных:
{"g"=>{"0"=>{"m"=>"and", "c"=>{"0"=>{"a"=>{"0"=>{"name"=>"total_revenue"}}, "p"=>"gt", "v"=>{"0"=>{"value"=>"1000"}}}}}}, "s"=>{"0"=>{"name"=>"stock_health", "dir"=>"asc"}}}
3 ответов:
Я думаю, что в базе данных вы храните запрос в виде строки.Пока вы вытаскиваете его из базы данных
@saved_search.query_parametersвозвращает вам строку.Но для обыска нужно, чтобы это был гашиш.Думаю, это главная проблема.Пока вы проходите через params its получает хэш, но из базы данных его получает строка.Вам нужно разобрать строку, которую вы получаете из переменной
@query, а затем передать ее в поиск.Для преобразования строки в хэш вы можете посмотреть на Как мне это сделать преобразование строкового объекта в хэш-объект? Ответы на вопросы.
Согласно Вашему вопросу:
{"g"=>{"0"=>{"m"=>"and", "c"=>{"0"=>{"a"=>{"0"=>{"name"=>"total_revenue"}}, "p"=>"gt", "v"=>{"0"=>{"value"=>"1000"}}}}}}, "s"=>{"0"=>{"name"=>"stock_health", "dir"=>"asc"}}}Вот как выглядит ваш хэш param, и вы сохраняете его для дальнейшего использования (закладка). Проблема здесь в том, что они хранятся в виде строки в вашей базе данных.
Два решения, которые я могу предложить:
1. Используйте HStore (http://www.postgresql.org/docs/9.0/static/hstore.html)
Вы можете использовать столбец типа HStore в вашей базе данных postgresql для хранения тех хэшей param, которые вы можете звоните по мере необходимости. Примечание: база данных PostgreSQL.
2. Преобразование строки в хэш:
Как преобразовать строковый объект в хэш-объект?
Примечание Я не рекомендую использовать функцию eval (), потому что
evalнебезопасно, и мы не можем доверять paramsРекомендация:
Еще один обходной путь для вашей проблемы, которую я выяснил, это:
1) перед сохранением параметров закладок преобразуйте их в json
# suppose bookmark is a column you are using in SavedSearch table to store those ransack search params[:q] then bookmark = {"g"=>{"0"=>{"m"=>"and", "c"=>{"0"=>{"a"=>{"0"=>{"name"=>"total_revenue"}}, "p"=>"gt", "v"=>{"0"=>{"value"=>"1000"}}}}}}, "s"=>{"0"=>{"name"=>"stock_health", "dir"=>"asc"}}} @saved_search = SavedSearch.new(save_search_params) @saved_search.bookmark = bookmark.to_json @saved_search.save2) Теперь, прежде чем передавать эти значения в ransack search, преобразуйте их в исходный хэш следующим образом:
Я надеюсь, что это поможет вам решить вашу проблему....require 'json' @saved_search = SavedSearch.find(id) original_bookmark = JSON.parse(@saved_search.bookmark)
Попробуйте этот камень: https://rubygems.org/gems/ransack_advanced_search is предоставляет приятный интерфейс для построения запросов, а также позволяет вам называть и хранить поиск для последующего использования. Is использует метод serialize из active_record для сохранения параметров запроса из базы данных
class SavedSearch < ActiveRecord::Base validates_presence_of :context, :description, :search_params serialize :search_params endОн автоматически преобразует search_params обратно в хэш, когда вы читаете его из базы данных
Comments