Необходимо определить, сколько элементов возвращается в результате поиска.

Я выполняю поиск перед вводом данных, чтобы убедиться, что пользователь не дублирует существующую запись, и у меня возникают проблемы с определением того, как захватить и использовать количество результатов поиска, чтобы направить пользователя к следующему шагу.

Я использую рельсы 3 и гем pg_search

модели/request.rb

class Request < ActiveRecord::Base
  attr_accessible :description, :title, :user_id, :who

  belongs_to :user
  has_many :comments

  include PgSearch
  pg_search_scope :search, against: [:title, :description, :who],
     using: {tsearch: {dictionary: "english"}},
       associated_against: {user: :name},
       ignoring: :accents

  def self.request_search(query)
    if query.present?
      search(query)
      where("title @@ :q or description @@ :q or who @@ :q", q: query)
    else
      scoped
    end
  end
end

request_controller.rb

  def index
    @requests = Request.request_search(params[:search]).order(sort_column + " " +  sort_direction).paginate(:per_page => 4, :page => params[:page])
    @users = User.all
  end

-- начать редактирование (согласно ответу Джесси)

request_controller.rb (продолжение)

  private

  def sort_column
    Request.column_names.include?(params[:sort]) ? params[:sort] : "title"
  end

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
  end

application_helper.rb

  def sortable(column, title = nil)
    title ||= column.titleize
    css_class = column == sort_column ? "current #{sort_direction}" : nil
    direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
    link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}
  end

_requests.html.erb (частичный)

<%= hidden_field_tag :direction, params[:direction] %>
<%= hidden_field_tag :sort, params[:sort] %>

<div class="row">
    <table class="table table-striped pretty">
       <thead>
          <tr>
            <th><%= sortable "title" %></th>
            <th><%= sortable "who", "Requested Pro" %></th>
            <th><%= sortable "created_at", "When" %></th>
            <th><%= sortable "request.user", "Requested by" %></th>
          </tr>
       </thead>
       <tbody>
       <% @requests.each do |request| %>
         <tr>
           <td><%= request.title %></td>
           <td><%= request.who %></td>
           <td><%= request.created_at %></td>
           <td><%= request.user.name %></td>
           <td><%= link_to 'Show', request, :class => 'btn btn-mini'%></td>
           <% if can? :update, @course %>
           <td><%= link_to 'Edit', edit_request_path(request) %></td>
               <td><%= link_to 'Destroy', request, 
                            confirm: 'Are you sure?', 
                            method: :delete, 
                            :class => 'btn btn-mini' %></td>
           <% end %>
         </tr>
      <% end %>
      </tbody>
    </table>
    <div class="pull-right"><%= will_paginate @requests %></div>    
</div>
<%= button_to 'New Request', new_request_path, :class => 'btn btn-large btn-primary mleft20 mtop20' %>

-- конец редактирования

Например, есть два способа попасть на главную страницу с других страниц: после поиска или по ссылке. Если пользователь переходит к индексу после поиска, я хотел бы вставить некоторый текст перед результатами поиска в представлении, в котором говорится: Ваш поиск дал "x" элементов. Если вы не видите то, что ищете, введите новый запрос, нажав на кнопку.

В противном случае, если пользователь только что связался с индексом, я хочу иметь возможность скрыть текст и просто отображать индекс как есть.

Я думаю, что могу как-то получить доступ к атрибутам поиска (если их правильно так называть) через request_search, но я не уверен, как реализовать это в представлении (после нескольких попыток).

Во-вторых, если я могу добавить, я хочу скопировать текст поиска в одно из полей ввода, если пользователь решит создать новую запись...

Пожалуйста, дайте мне знать, ясно ли я изложил вопрос(ы), и если вы можете пролить на меня свет. Заранее спасибо.


person Brian McDonough    schedule 12.06.2012    source источник


Ответы (1)


  def index
    @requests = Request.request_search(params[:search]).order(sort_column + " " +  sort_direction).paginate(:per_page => 4, :page => params[:page])
    @users = User.all
    @search = params[:search] 
 end

на ваш взгляд:

<% if @search.present? %> 
  <p>Your search yielded <%= pluralize(@requests.total_entries, "item") %>. If you don't see what you're looking for, enter a new request by clicking on the button.</p>
<% end %>

<%= form_tag, url: "/" do %>
  <%= label_tag :search, "Search for:"%>
  <%= text_field_tag :search, value: @search %>
  <%= submit_tag "Search" %>
<% end %>

Последнее примечание: похоже, вы пропустили код, который получает «sort_column». В нынешнем виде у вас возникнут проблемы с запуском приведенного выше кода, так как sort_column будет переменной без ссылок.

person Jesse Wolgamott    schedule 12.06.2012
comment
(Я предполагаю, что вы используете will_paginate здесь для нумерации страниц) - person Jesse Wolgamott; 12.06.2012
comment
Эй, Джесси. Спасибо за быстрый ответ. Отредактировал вопрос, чтобы включить соответствующие методы сортировки и will_paginate в представление в соответствии с вашим предложением. - person Brian McDonough; 12.06.2012
comment
Ваш ответ отлично работает, когда пользователь переходит на страницу через поиск (и этого достаточно, чтобы пройти оставшуюся часть пути). Все еще разрабатываем, что происходит, когда пользователь приходит по ссылке. Прямо сейчас ваше решение возвращает нулевые элементы при переходе по ссылке, потому что нет параметров поиска, т. Е. Нет поиска. Почти уверен, что я могу справиться со вторым случаем, перенаправляя на другую целевую страницу и используя те же партиалы. Выложу после того, как смогу разобраться. Спасибо еще раз. - person Brian McDonough; 12.06.2012
comment
В завершение я использовал условный оператор, чтобы определить, переходит ли пользователь к индексу из поиска или по ссылке: ‹% if @search.present? %› и ‹% elsif @seach.nil? %›. Я также подумываю добавить третье условие ‹% else %›, которое будет действовать, если пользователь заходит на страницу, а найденных элементов нет, то есть поиск будет присутствовать, но total_entries будет равен нулю. Я надеюсь, что это поможет кому-то еще в будущем. Б - person Brian McDonough; 13.06.2012