Rails 4 / Filterrific gem - проблема с логическим полем - PullRequest
0 голосов
/ 01 сентября 2018

В моем приложении есть поле с именем tested, которое является полем boolean.

То, чего я хочу достичь, - это простой checkbox, где пользователи могут проверять или снимать флажки и фильтровать на основе tested.

В моей модели: 1009 *

filterrific :default_filter_params => { :sorted_by => 'created_at_desc' },
              :available_filters => %w[
                sorted_by
                search_query
                with_created_at_gte
                with_tested
              ]
scope :with_tested, lambda { |flag|
    return nil  if 0 == flag # checkbox unchecked
    where(tested: true)
}

/// Other scopes

и на мой взгляд / форма у меня есть:

= f.check_box :with_tested

В моей модели я также безуспешно пробовал разные подходы:

scope :with_tested, lambda { |value|
  where('posts.tested = ?', value)
}

// and 

scope :with_tested, lambda { |query|
  return nil  if 0 == query # checkbox unchecked
  where('posts.tested == ?', query)
}

// and

scope :with_tested, lambda { |flag|
    return nil  if 0 == flag # checkbox unchecked
    where(tested: [flag])
}

Когда я пытаюсь фильтровать на основе tested, я вижу, что мой фильтр пытается фильтровать (я вижу вращение фильтра) , но мои записи не фильтруются правильно.

Я не уверен, что сделал неправильно. Любое предложение и помощь приветствуется!

Все остальные части фильтра работают нормально

PS: я не добавил with_tested в свой контроллер, так как узнал, что он мне не нужен


Версии:

Ruby on Rails: 4.2.4

Filterrific: 2.1.2

1 Ответ

0 голосов
/ 28 января 2019

Проблема в where(tested: [flag]), потому что для не установлено в true или false. Чтобы решить проблему where, следует знать , что такое value в в этом случае .

Поэтому where(tested: [flag]) следует изменить на: where(tested: true) или where(tested: false).

Сначала вам нужно указать это в вашем model:

scope :with_tested, lambda { |flag|
      return nil  if 0 == flag # checkbox unchecked
      where(tested: true)
    }

В вашем view сделайте следующее:

= f.check_box :with_tested

и добавьте :with_tested в свой контроллер в available_filters.

PS: код был протестирован и работает

...