Как я могу иметь несколько поисков? - PullRequest
0 голосов
/ 05 февраля 2011

У меня есть модель места, где каждое место принадлежит области и типу. У меня есть 2 формы, состоящие из флажков на странице индекса, которые позволяют мне фильтровать записи места, показанные по типу или области, к которой они принадлежат. Однако используется только последняя строка в индексе def. Как их объединить, чтобы обе формы были активными?

Контроллер:

class VenuesController < ApplicationController

  def index
    @venues = Venue.all(:conditions => {:area_id => params[:areas]})
    @venues = Venue.all(:conditions => {:venuetype_id => params[:venuetypes]})
  end
end

Вид:

<div class="filter_options_container">

  <form class="filter_by_area_form", method="get">
    <% Area.all.each do |a| %>
      <%= check_box_tag("areas[]", a.id) %>
      <%= a.name %>
    <% end %>
    <input type="submit" value="Filter" />
  </form>

  <br><br>

  <form class="filter_by_venuetype_form", method="get">
    <% Venuetype.all.each do |v| %>
      <%= check_box_tag("venuetypes[]", v.id) %>
      <%= v.name %>
    <% end %>
    <input type="submit" value="Filter" />
  </form>
</div>

<div class="venue_partials_container">
  <%= render :partial => 'venue', :collection => @venues %>
  <div class="clearall"></div>
  <%= link_to 'add a new venue', new_venue_path, :class => "add_new_venue_button" %>
</div>

Так что работает только форма venuetype, или если я изменю индекс def на:

  def index
    @venues = Venue.all(:conditions => {:venuetype_id => params[:venuetypes]})
    @venues = Venue.all(:conditions => {:area_id => params[:areas]})
  end

Тогда работает только форма областей.

EDIT

Я изменил контроллер так:

  def index
    @venues = Venue.all(:conditions => {:venuetype_id => params[:venuetypes]}&&{:area_id => params[:areas]})
  end

и вид на:

<div class="filter_options_container">
  <form class="filter_form", method="get">
    <fieldset class="filter_form_fieldset">
      <% Area.all.each do |a| %>
        <%= check_box_tag("areas[]", a.id) %>
        <%= a.name %>
      <% end %>
    </fieldset><br>

    <fieldset class="filter_form_fieldset">
      <% Venuetype.all.each do |v| %>
        <%= check_box_tag("venuetypes[]", v.id) %>
        <%= v.name %>
      <% end %>
      <input type="submit" value="Filter" />
    </fieldset>
  </form>
</div>

После выбора области и типа из формы и нажатия кнопки отправки URL-адрес отображает «/ venues? Area [] = 2 & venuetypes [] = 13», но все еще фильтрует результаты по области, а не по типу.

Спасибо за любую помощь.

1 Ответ

2 голосов
/ 06 февраля 2011

Для построения поисковых запросов вы можете использовать scoped:

Rails 2

@venues = Venue.scoped
@venues = @venues.scoped(:conditions => { :venuetype_id => params[:venuetypes] }) if params[:venuetypes].present?
@venues = @venues.scoped(:conditions => { :area_id => params[:areas] }) if params[:areas].present?

Если вы создаете именованные области, например, @Steve Smith предложил:

class Venue < ActiveRecord::Base
  named_scope :with_type, lambda { |types|
    types.present? ? { :conditions => { :venuetype_id => types } } : {} }
  named_scope :with_area, lambda { |areas|
    areas.present? ? { :conditions => { :area_id => areas } } : {} }
end

Тогда вы можете просто сделать:

@venues = Venue.with_type(params[:venuetypes]).with_area(params[:areas])

Rails 3

@venues = Venue.scoped
@venues = @venues.where(:venuetype_id => params[:venuetypes]) if params[:venuetypes].present?
@venues = @venues.where(:area_id => params[:areas]) if params[:areas].present?

Или:

class Venue < ActiveRecord::Base
  scope :with_type, lambda { |types|
    types.present? ? where(:venuetype_id => types) : scoped }
  scope :with_area, lambda { |areas|
    areas.present? ? where(:area_id => areas) : scoped }
end

Тогда вы можете просто сделать:

@venues = Venue.with_type(params[:venuetypes]).with_area(params[:areas])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...