Поиск и сортировка цепочек в рельсах с помощью serachlogic - PullRequest
0 голосов
/ 20 января 2011

Мой код очень похож на код в railscasts # 240

Разница в том, что я использую рельсы 2.3.10, поэтому я не использую 'где'.Вместо этого я использую serachlogic, и моя модель выглядит следующим образом ...

//Model.rb
def self.search(search)
      if search
        Model.column_name_like(search)
      else
        find(:all)
      end
    end

(я использую логику поиска, потому что мне нужна нечувствительность к регистру, потому что я развертываюсь на heroku (postgres))

Когда я пытаюсь объединить свои методы в цепочку, как в Railscast и в других уроках, я получаю сообщение об ошибке, например «Порядок методов не найден»

Мой контроллер здесь ...

 @objects=Model.search(params[:search]).order(sort_order('created_at'))

Это немного другой метод сортировки столбцов, который работал у меня до того, как я вставил поиск.

Почему этот метод работает в некоторых руководствах, но в этом случае выдает ошибку.Это потому что уроки в рельсах 3?

Ответы [ 2 ]

1 голос
/ 22 января 2011

Несколько дней спустя я сам нашел оптимальное решение. Я должен был изменить мою модель. Вместо того, чтобы возвращать find (: all) в else, я возвратил новый «пустой» объект поиска

@search=Model.column_name_like("")

Для справки моя модель и контроллер, который теперь поддерживает сортировку, поиск и разбивку на страницы, выглядит так ...

def self.search(search)
      if search
        Model.column_name_like(search)
      else
        @search=Model.column_name_like("")
      end
    end

def index
  @per_page = params[:per_page] || Lease.per_page || 20
  @search=Lease.search(params[:search])
  @objects=@search.find(:all, :order=>(sort_column + " "+ sort_direction)).paginate(:per_page => @per_page, :page => params[:page])
end

private 
def sort_column
  Model.column_names.include?(params[:sort]) ? params[:sort] : "default_column_name"
end

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

Не забудьте разместить в своем представлении скрытые помощники для передачи имени и направления столбца.

<p>
<% form_tag leases_path, :method => 'get' do %>
<p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
</p>
<%=hidden_field_tag :direction, params[:direction]%>
<%=hidden_field_tag :sort, params[:sort]%>

<% end %>
0 голосов
/ 20 января 2011

Похоже, что Railscast не использует searchlogic, что объясняет, почему это не работает. Он использует новые библиотеки Active Record (Arel) для Rail3 для выполнения поиска, похожего на логику.

Вместо:

@objects=Model.search(params[:search]).order(sort_order('created_at'))

Попробуйте:

@objects=Model.search(params[:search]).ascend_by_created_at

Или:

@objects=Model.search(params[:search]).descend_by_created_at

ура

...