Учитывая студентов, которые могут изучать разные вещи, я храню их в столбце jsonb со ссылкой на таблицу исследований. Индексирование исследований не очень важно (на данный момент), и я предпочитаю избегать таблицы отношений.
Поэтому: add_column :students, :studies, :jsonb, default: []
И в моей простой форме (в тонком):
= simple_form_for @student do |f|
= f.input :studies, as: :check_boxes, collection: Study.all, label_method: :name
Это работает изумительно хорошо, учитывая краткость и простоту этого. За исключением одной маленькой детали: форма не проверяет ранее сохраненные исследования, так как их идентификаторы хранятся в виде строк в массиве jsonb ["", "2", "12"]
, а для формы явно требуются целые числа.
Я прибегнул к добавлению значения исследований функция в модели Стьюдента, но, кажется, слишком много (также .reject(&:zero?)
для удаления пустого значения массива):
def studies=(array)
# transform strings to integers and remove leading empty value
super(array.map(&:to_i).reject(&:zero?))
end
Есть ли лучший способ?