Как добавить тег формы для атрибута checbox, который хранится как дата / время в базе данных? - PullRequest
0 голосов
/ 24 апреля 2020

Допустим, у меня есть таблица с именем advertisements. Мне нужно добавить поле для него, чтобы люди могли пометить его как active или inactive. Я могу добавить поле boolean, называемое неактивным, и это прямой подход.

Существует другой подход, в котором я могу создать поле inactive с типом данных datetime. Это не только говорит мне, является ли реклама активной / нет, но также показывает, когда она была деактивирована. Поэтому, если значение равно нулю, оно активно, а если это временная метка, оно было отключено в то время в прошлом.

Однако проблема заключается в добавлении его в помощник по форме. Для реализации флажка Rails предлагает следующее:

= f.check_box :inactive, { class: 'something' }

Это прекрасно работает с типом данных как boolean в дБ. Как мне сделать эту работу со значением datetime?

Спасибо!

Ответы [ 5 ]

1 голос
/ 24 апреля 2020

Попробуйте

= f.check_box :inactive, checked: form.object.inactive.present?,  { class: 'something' }
0 голосов
/ 26 апреля 2020

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

Я сделал это

= f.check_box :inactive, { class: 'something', checked: f.object.inactive.present? }, DateTime.now

Последняя часть DateTime.now - это значение, которое присваивается, когда пользователь устанавливает флажок. Таким образом, вы можете сохранить значение DateTime, используя реализацию флажка. Наличие значения помогает вам определить, должен ли быть установлен флажок или нет при отображении формы.

Единственное предостережение при таком подходе - это точность значения. Пользователь может отправить форму через несколько минут / часов после открытия формы. Если для вас важно зафиксировать правильное значение, вы можете использовать JS для назначения точного значения или иметь логический номер c в контроллере.

0 голосов
/ 25 апреля 2020

Предполагая, что у нас есть метод для разрешения параметров

def advertisment_params
  params.require(:advertisement).permit(:inactive)
end

, изменив метод на

def advertisment_params
  params[:advertisement][:inactive] = params[:advertisement][:inactive] == "0" ? nil : @advertisement.nil? ? DateTime.now.to_s(:db) : @advertisement.inactive
  params.require(:advertisement).permit(:inactive)
end

Подойдет.

0 голосов
/ 25 апреля 2020

Для отслеживания времени деактивации

Добавить столбец deactivated_at datetime

add_column :advertisements, :deactivated_at, :datetime

в форме

<%= form.text_field :deactivated_at, class: "add-datetimepicker" %>

добавить указатель даты / времени в поле

bootstrap -дата времени сбора данных
дата-времени выбора

0 голосов
/ 24 апреля 2020

Active Record предоставляет методы запроса для каждого атрибута в вашей модели, они названы в честь имени атрибута, заканчивающегося вопросительным знаком (например, для атрибута model.name есть model.name?), который ответил ложным, когда атрибут пустой и true в противном случае. Кроме того, при работе со значениями чисел c метод запроса вернет false, если значение равно нулю. Методы запроса AR

дадут вам получатель для вашего флага inactive?, вам нужно добавить установщик в разрешить сохранение изменений в атрибуте inactive?.

...