Как сохранить строку в виде массива в столбце базы данных, используя Ruby on Rails - PullRequest
0 голосов
/ 31 декабря 2018

Этот вопрос задают много раз на SO.Основная проблема заключается в том, что ничто не вписывается в мою ситуацию.

Дело в том, что я не могу сохранить типизированное содержимое в виде массива в столбце базы данных.

text_field, код которого:

= text_field_tag 'product[keywords][]', @product.keywords, class: 'tab-input
product_keywords'

В сильных параметрах контроллера:

params.require(:product).permit(:id, :name, :keywords => [])

Jquery-код, который не удаляет значение при удалении, когда введено неправильное значение, но онодобавьте запятые после каждого элемента, так как я хочу принять значение в одном столбце через запятую.

  $(document).on 'keyup', '.product_keywords', ->
    keyword = @value.replace(/(\w)[\s,]+(\w?)/g, '$1, $2')
    if keyword != @value
      @value = keyword
    return

код модели:

serialize :keywords, Array

код миграции:

class AddKeywordsToProducts < ActiveRecord::Migration[5.1]
  def change
    add_column :products, :keywords, :text
  end
end

Итак, если кто-то пишет, abc и пробел, в конце добавляется запятая.после трех напечатанных слов это будет выглядеть так:

abc, dbx, she

Теперь я хочу сохранить его как массив в столбце, но он не хранится должным образом.он хранится как:

["abc, dbx, she"]

Также, пожалуйста, кто-нибудь может сказать мне лучшие случаи для обработки этих случаев?Плюс лучшие практики для работы с такими случаями, используя ruby, так что я изучу это на будущее?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Передача элементов массива с использованием одного тега формы невозможна для передачи в виде массива, а передача массива в виде строки, необходимо обработать его рядом с белым списком параметров,

permitted_params = params.require(:product).permit(:id, :name, :keywords => [])
permitted_params[:keywords] = permitted_params[:keywords][0].split(/\s*,\s*/)
0 голосов
/ 31 декабря 2018

Возможно, вам нужен собственный сериализатор, как показано здесь .Поэтому вместо:

serialize :keywords, Array

Вы можете сделать что-то вроде:

serialize :keywords, KeywordSerializer

И где-то в helpers:

class KeywordSerializer 
  def self.dump(what)
    what.join(", ")
  end
  def self.load(what)
    what.split(/\s*,\s*/)
  end
end
...