Есть ли лучший способ управлять отношениями has_many с jsonb в Rails? - PullRequest
0 голосов
/ 07 марта 2020

Учитывая студентов, которые могут изучать разные вещи, я храню их в столбце 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

Есть ли лучший способ?

1 Ответ

1 голос
/ 09 марта 2020

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

JSONB хорош, дает гибкость, и его даже можно красиво запросить, но если у вас нет действительно веской причины для go с этим в этом В этом случае вам, вероятно, следует придерживаться has_many :through... ассоциации.

В любом случае, в зависимости от того, как вы все подключили, возможно, вместо переопределения метода назначения, вам будет лучше, если вы добавите свою логику c в фильтры действий или где вы делаете проверку модели ...

...