如何在Ruby-On-Rails应用程序的用户模型中存储数组?

sqyvllje  于 2023-03-04  发布在  Ruby
关注(0)|答案(2)|浏览(86)

我试图在我的表users的一列中保存一个字符串数组。我在我的迁移文件add_column :users, :choices, :string中有这一行。这不起作用,因为我试图存储一个数组而不仅仅是一个字符串,我的终端显示Unpermitted parameter: :choices。我如何存储一个数组?(显然add_column :users, :choices, :array不起作用)

vxqlmq5t

vxqlmq5t1#

数据库列实际上与错误无关,您可以通过定义类型并使用array: true选项来定义数组列,因为大多数数据库中数组都是类型化的,这与Ruby不同:

add_column :users, :choices, :string, array: true

然而,这通常是一个坏主意,因为您将多个值放在一列中,并放弃了离散表在规范化、关联、外键等方面的所有优势,从而违反了第一范式(1 NF)。这是每个人在发现数组列时都会想到的想法-但实际上并不是一个好的设计决策。
当传递具有不允许的键的ActionController::Parameters示例时,将引发Unpermitted parameter: :choices。它与基础数据库列或属性完全无关。
您可以通过传递一个带有空数组的散列键来将数组列列入白名单:

params.require(:user)
      .permit(:foo, :bar, choices: [])

这允许数组包含任何类型的允许标量值。

ct2axkht

ct2axkht2#

在迁移过程中应该就像这样简单

def change
    add_column :users, :choices, :string, array: true
  end

那么您可能希望防止写入非数组类型。

#app/models/users.rb

  def choices=(input)
    raise TypeError, 'choices must be an array' unless input.is_a?(Array)
    super
  end

相关问题