2010-06-23 23 views
23

Estoy en los rieles 2.3.8 & Estoy usando mysql como adaptador de db. Quiero almacenar matrices en mi base de datos. Después de buscar, podría encontrar esta muy útil article.Almacenamiento de matrices en la base de datos utilizando ActiveRecord

Ahora necesito usar la GUI para la entrada & no solo la consola del servidor. Entonces digo que tengo un campo de texto llamado nums que lógicamente debería tener una matriz int. ¿Cuál debería ser el formato de nums para que sea más fácil recuperar & almacenar la matriz fuera de esa cadena?

+0

En los carriles 4, ahora se puede utilizar el 'array' tipo, que almacena como una matriz de PostgreSQL o como una cadena en todo lo demás. – Zaz

Respuesta

35

Si usa serialize, entonces no debería tener que preocuparse por cómo se almacenan los datos en el campo de texto, aunque en realidad es YAML.

serialize se documenta en the Rails/ActiveRecord API (desplazarse hacia abajo a la sección titulada "Conjuntos de Ahorro, hashes y otros objetos que no son asignables en las columnas de texto")

Para la visualización, es necesario un formato que sea comprensible para los usuarios y que se puede convertir fácilmente en una matriz en tu código. ¿Coma o espacio delimitado?

Formateo de salida:

delim = ',' # or ' ' for spaces, or whatever you choose 
array.join(delim) 

la conversión posterior en una matriz podría funcionar de la siguiente manera:

num_array = nums.split(delim).map(&:to_i) # or to_f if not integers 

o tal vez utilizando una cuerda # exploración?

num_array = nums.scan(/\d+/).map(&:to_i) # for positive integers 
+0

Gracias Mike. :) Ya lo había descubierto. Una manera aún más fácil (aunque propensa a errores) es utilizar directamente la función eval. so: num_array = eval (nums) ¡trabaje dulce también! –

+3

Es más fácil, pero si va a usar eval, necesita borrar los datos para entradas inválidas MUCHO a fondo. eval() abre una tonelada de agujeros de seguridad si no tienes cuidado. – MunkiPhD

13

Si está utilizando postgres y rails 4, ahora tiene una mejor opción nativa.

# db/migrate/20140207133952_create_books.rb 
create_table :books do |t| 
    t.string 'title' 
    t.string 'tags', array: true 
    t.integer 'ratings', array: true 
end 
add_index :books, :tags, using: 'gin' 
add_index :books, :ratings, using: 'gin' 

# app/models/book.rb 
class Book < ActiveRecord::Base 
end 

# Usage 
Book.create title: "Brave New World", 
      tags: ["fantasy", "fiction"], 
      ratings: [4, 5] 

## Books for a single tag 
Book.where("'fantasy' = ANY (tags)") 

## Books for multiple tags 
Book.where("tags @> ARRAY[?]::varchar[]", ["fantasy", "fiction"]) 

## Books with 3 or more ratings 
Book.where("array_length(ratings, 1) >= 3") 

http://edgeguides.rubyonrails.org/active_record_postgresql.html

Cuestiones relacionadas