【问题标题】:How to store string as array in database column using Ruby on Rails如何使用 Ruby on Rails 将字符串作为数组存储在数据库列中
【发布时间】:2018-12-31 07:40:55
【问题描述】:

这个问题在 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​​ 处理此类情况的最佳实践,以便我将来学习它?

【问题讨论】:

  • 您可以使用str.split(/\s*,\s*/) 拆分字符串并将其用作数组,这也将删除前导空格和无效空格
  • @ray 我需要在什么阶段这样做?
  • 检查已发布的答案,是否有效

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


【解决方案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

【讨论】:

  • 我现在应该在每个关键字的末尾添加关键字而不添加自定义逗号吗?
  • 这取决于您和dumpload 的期望实现;我刚刚出示了通用收据。
  • 这是一个非常好的方法,但我在 load 方法中得到了零,为什么?
  • @ray 我不知道。
  • @ray 相同。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2013-12-10
    • 2017-09-12
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多