eq_any для логических атрибутов — обыск

У меня есть логический атрибут (опубликовано) в моей модели book, и я хочу отфильтровать все книги, используя флажки для этого значения.

class Book < ActiveRecord::Base
  attr_accessible :published
end

Это означает, что мне нужно что-то вроде eq_any, но вместо true или false. Есть ли способ сделать это с помощью Ransack?

ОБНОВЛЕНИЕ

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


person Renan    schedule 05.07.2013    source источник


Ответы (3)


Я решил это, используя список выбора с тремя вариантами: «Все», «Да» и «Нет».

= select :q, :published_true, [['Yes', 1], ['No', 0]], { include_blank: 'All', selected: params[:q] ? params[:q][:published_true] : '' }

Строка запроса для publish_true будет выглядеть так:

q[published_true]=1 1 вернет опубликованные книги

q[published_true]=0 0 вернет неопубликованные книги

q[published_true]= пусто — будут возвращены как опубликованные, так и неопубликованные книги.

person Fred Bergman    schedule 26.11.2014

Выбранный ответ работает нормально, но, по крайней мере, в 2016 году можно написать что-то получше. Использование функциональности «eq» позволяет удалить некоторые настройки. Окончательный результат:

<%= f.select :published_eq, [['Yes', true], ['No', false]], include_blank: 'All' %>
person spaghetticode    schedule 14.11.2016
comment
исправьте синтаксис ‹%= f.select :published_eq, [['Да', правда], ['Нет', ложь]], include_blank: 'Все' %› - person shoaib; 25.02.2017

Ренан, вы можете сделать это, используя предикаты «истина» и «ложь» (другие предикаты перечислены в ссылке на документацию ниже).

В вашей форме код флажка будет выглядеть примерно так:

<%= f.checkbox :published_true %>
<%= f.checkbox :published_false %>

Таким образом, в вашей форме установка первого флажка (published_true) вернет все книги, для которых опубликовано значение true, установка второго поля (published_false) вернет все книги, для которых опубликовано значение false (неопубликованные), а отправка формы без установки флажка приведет к вернуть все книги.

Дополнительную информацию можно найти в документации здесь: https://github.com/ernie/ransack/wiki/Basic-Searching

person QMFNP    schedule 12.08.2013
comment
Но если я сделаю так, как вы говорите, когда я отправлю форму со снятым флажком, она будет получать только те книги, опубликование которых не соответствует действительности. Я хотел бы иметь два флажка (один для публикации, а другой для неопубликованного), и когда я проверяю оба, он фактически выполняет ИЛИ, а не И. - person Renan; 26.08.2013
comment
@Renan У вас была возможность попробовать код? У меня есть несколько похожих поисков в проекте, над которым я работаю, и когда я отправляю форму без установки флажка, ransack игнорирует ее и возвращает все результаты. - person QMFNP; 27.08.2013
comment
Вы правы, но теперь, когда я об этом думаю (это мой довольно старый вопрос, поэтому я уже обошел эту проблему), мне не нужен только один флажок. Я хочу, чтобы пользователь также мог выбирать только неопубликованные книги, чего не сделало бы ваше решение. Я обновлю вопрос, чтобы сделать его более ясным. - person Renan; 28.08.2013
comment
Я обновил свой ответ. У меня была своя доля головных болей, надеюсь, это поможет. - person QMFNP; 28.08.2013