Rails 3使用ransack搜索和排序并尝试限制排序选择中的选项

时间:2013-02-12 22:54:54

标签: ruby-on-rails-3 sorting search ransack

我的rails应用程序中有一个页面,显示了列表列表(使用will_paginate分页)。我试图找到一个很好的宝石来实现搜索和排序与此页面上的列表。 Ransack宝石看起来像我需要的东西,但我遇到了它的问题。这就是我的代码现在使用Ransack gem。

我的模型(不包括整个模型,不希望验证和额外的代码妨碍):

UNRANSACKABLE_ATTRIBUTES = ["id", "state", "show_email", "email", "show_phones", "primary_phone", "secondary_phone", "updated_at", "user_id"]

def self.ransackable_attributes auth_object = nil
  (column_names - UNRANSACKABLE_ATTRIBUTES) + _ransackers.keys
end

我的控制器操作:

def index
  @search = Listing.search(params[:q])
  @listings = @search.result.paginate(page: params[:page], per_page: 20, joins: "LEFT OUTER JOIN attachments ON listings.id = attachments.attachable_id", select: "listings.*, COUNT(attachments.id) AS photos", group: "listings.id", order: "listings.created_at DESC, listings.title ASC, listings.id DESC")
  @search.build_sort if @search.sorts.empty?
end

我在页面上的搜索表单:

    <div class="advanced-search">
        <%= search_form_for @search do |f| %>
            <div class="search-by">
                <div class="search-field">
                    <%= f.label :title_cont, "Title Contains" %>
                    <%= f.text_field :title_cont %>
                </div>
                <div class="search-field">
                    <%= f.label :description_cont, "Description Contains" %>
                    <%= f.text_field :description_cont %>
                </div>
                <div class="search-field">
                    <%= f.label :price_gteq, "Price Between" %>
                    <%= f.text_field :price_gteq %>
                    <%= f.label :price_lteq, "and" %>
                    <%= f.text_field :price_lteq %>
                </div>
            </div>
            <div class="sort-by">
                <%= f.sort_fields do |s| %>
                    <%= s.sort_select %>
                <% end %>
            </div>
            <div class="search-actions">
                <%= f.submit "Search" %>
            </div>
        <% end %>
    </div>

我的路线:

resources :listings do
  collection do
    match 'search' => 'listings#index', via: [:get], as: :search
  end
end

现在我拥有的一切已经能够让应用程序成功搜索和排序列表。

我的问题: sort_select字段显示“无法解决”的所有选项。有没有办法让一个属性可用于搜索,但排序?例如,我希望能够搜索description属性,但在排序中包含该属性没有任何意义。我如何在一个属性而不是另一个属性中使用属性?感谢您的帮助,如果我的问题不够明确,请告诉我。

1 个答案:

答案 0 :(得分:0)

无法弄清楚如何将我想要的值输入到下拉列表中,所以我只使用了链接。这就是我最终的排序方式。

Sort by <%= sort_link @search, :title %> | <%= sort_link @search, :price %> | <%= sort_link @search, :created_at, "Date Listed" %>