Я наткнулся на это в поисках решения для рендеринга бликов с помощью поиска солнечных пятен на виде рельсов.
Я не нашел нигде готового решения, поэтому использовал часть этого поста, чтобы сделать один измой один.Я довольно плохо знаком с рельсами, так что это может быть не совсем путь RoR.
В моем случае я выполнил полнотекстовый поиск по двум полям, назвав их notes
и description
.
Для того, чтобы иметь возможность рендерить в html блики, я ввел хэш значений, содержащий идентификатор записи, имя столбца и его выделенное значение, соответствующим образом отформатированные.Это позволяет мне выделять результаты поиска в разных полях.
entry.rb:
searchable do
text :description, :stored => true
text :notes, :stored => true
end
records_controller.rb:
@search = Entry.search
if params[:search].nil? || params[:search].empty?
stext=''
else
stext=params[:search]
end
fulltext stext, :highlight => true
paginate(page: params[:page], :per_page => 10)
end
@entries=@search.results
@results=Hash.new
@search.hits.each do |hit|
hit.highlights(:description).each do |highlight|
id=hit.primary_key.to_s.to_sym
fr=highlight.format { |word| "<result>#{word}</result>" }
@results.merge!(id => ["description",fr])
end
hit.highlights(:notes).each do |highlight|
id=hit.primary_key.to_s.to_sym
fr=highlight.format { |word| "<result>#{word}</result>" }
@results.merge!(id => ["notes",fr])
end
end
и в представлении, где бы он ни находилсяЯ хочу отобразить любое значение, я делаю следующее:
<% @entries.each do |f| %>
<% j=f[:id].to_s.to_sym %>
<% if !@results[j].nil? && @results[j][0]=="description" %>
<%= @results[j][1].html_safe %>
<% else %>
<%= f[:description] %>
<% end %>
[...] (likewise for notes)
<% end %>
Обратите внимание, что я создал определение css для разметки <result>
, чтобы сделать текст заметным.