如何使用Ruby on Rails将字符串存储为数据库列中的数组

时间:2018-12-31 07:40:55

标签: ruby-on-rails arrays ruby ruby-on-rails-5.1

这个问题在SO上被问过很多次。主要问题是没有什么适合我的情况。

在这种情况下,我无法将键入的内容作为数组存储在数据库列中。

文本字段,其代码为:

= 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"]

也请有人告诉我处理这些案件的最佳方案吗? 加上使用红宝石处理此类案件的最佳实践,以便将来我会学习吗?

2 个答案:

答案 0 :(得分:1)

您可能希望使用here所示的自定义序列化程序。所以代替:

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

答案 1 :(得分:0)

使用单一表单标签传递数组元素不能作为数组传递,而不能将数组作为字符串传递,您需要在将参数列入白名单的附近对其进行处理,

permitted_params = params.require(:product).permit(:id, :name, :keywords => [])
permitted_params[:keywords] = permitted_params[:keywords][0].split(/\s*,\s*/)