我的rails应用程序中有一个页面,它显示了列表列表(使用will_page分页)。我正在努力寻找一个好的gem来实现搜索和排序与这个页面上的列表。Ransack宝石看起来像我需要的,但我遇到了一个问题。这就是我现在使用Ransack的代码的样子。
我的模型(不包括整个模型,不希望验证和额外的代码妨碍):
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
属性,但在排序中包含该属性没有任何意义。如何在其中一个中使用属性而不在另一个中使用?谢谢你的帮助,如果我的问题不够清楚,请告诉我。
不知道如何将我想要的值输入下拉列表,所以我只使用了链接。这是我最后整理的结果。
Sort by <%= sort_link @search, :title %> | <%= sort_link @search, :price %> | <%= sort_link @search, :created_at, "Date Listed" %>