Как отфильтровать результаты по нескольким полям? - PullRequest
2 голосов
/ 12 мая 2010

Я работаю над приложением для опроса в ruby ​​на рельсах и на странице результатов. Я хочу, чтобы пользователи могли фильтровать ответы по ряду демографических вопросов, которые я задавал в начале опроса.

Например, я спросил пользователей, какой у них пол и карьера. Так что я думал о выпадающих полах и карьере. Оба раскрывающихся списка будут по умолчанию для всех, но если пользователь выберет женщину и маркетолога, то моя страница результатов будет отвечать только от женщин-маркетологов.

Я думаю, что правильный способ сделать это - использовать named_scopes, где у меня есть named_scope для каждого из моих демографических вопросов, в этом примере - пол и карьера, которые будут принимать очищенное значение из раскрывающегося списка для использования в условном выражении. но я не уверен, как динамически создать цепочку named_scope, так как у меня есть 5 демографических вопросов, и, вероятно, некоторые из них будут заданы всем.

Ответы [ 3 ]

7 голосов
/ 12 мая 2010

Вы можете связать именованные области вместе:

def index
  @results = Results.scoped
  @results = @results.gender(params[:gender]) unless params[:gender].blank?
  @results = @results.career(params[:career]) unless params[:career].blank?
end

Однако я предпочитаю использовать has_scope gem:

has_scope :gender
has_scope :career

def index
  @results = apply_scopes(Results).all
end

Если вы используете has_scope с наследованными_ресурсами , вам даже не нужно определять действие индекса.

3 голосов
/ 12 мая 2010
 named_scope :gender,lambda { |*args|
    unless args.first.blank?
      { :conditions => [ "gender = ?", args.first] }   
    end
  }

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

Result.gender("Male") will return male results.
Result.gender("") will return male and female too.

И вы можете связать все свои методы таким образом. Наконец, в качестве фильтра вы можете иметь:

Result.age(16).gender("male").career("beginer")
Result.age(nil).gender("").career("advanced") - will return results with advanced career, etc.
0 голосов
/ 10 сентября 2013

Попробуйте что-то вроде этого:

VistaFact.where( if active then {:field => :vista2} else {} end)

Или вот так:

VistaFact.where(!data.blank? ? {:field=>data.strip} : {}).where(some? ? {:field2 => :data2} : {}).where ...

Это работа для меня очень приятно!

...