Estoy tratando de guardar una serie de cadenas en una columna de users de mi tabla. Tengo esta línea en mi archivo de migración add_column :users, :choices, :string . Esto no funciona porque estoy tratando de almacenar una matriz y no solo una cadena, mi terminal muestra Unpermitted parameter: :choices . ¿Cómo puedo almacenar una matriz? (Obviamente add_column :users, :choices, :array no funciona).
La columna de la base de datos realmente no tiene nada que ver con el error. Las columnas de la matriz se definen definiendo un tipo y usando la opción array: true , ya que las matrices se escriben en la mayoría de las bases de datos, a diferencia de Ruby:
add_column :users, :choices, :string, array: trueSin embargo, esto suele ser una mala idea ya que está violando la primera forma normal (1NF) al poner múltiples valores en una columna y renunciar a todas las ventajas que tiene tener una tabla discreta en términos de normalización, asociaciones, claves foráneas, etc. Esto es idea que todos se entretienen cuando descubren columnas de matriz, pero no es realmente una buena decisión de diseño.
Unpermitted parameter: :choices se genera cuando pasa una instancia de ActionController::Parameters con una clave no permitida. No tiene absolutamente nada que ver con la columna de base de datos subyacente o el atributo.
Puede incluir en la lista blanca las columnas de la matriz pasando una clave hash con una matriz vacía:
params.require(:user) .permit(:foo, :bar, choices: [])Esto permite una matriz que contiene cualquier tipo de valor escalar permitido.
Debería ser tan simple como esto en su migración
def change add_column :users, :choices, :string, array: true endEntonces probablemente desee evitar escribir tipos que no sean de matriz.
#app/models/users.rb def choices=(input) raise TypeError, 'choices must be an array' unless input.is_a?(Array) super end