2010-06-23 7 views
23

Je suis sur les rails 2.3.8 & J'utilise mysql comme adaptateur db. Je veux stocker des tableaux dans ma base de données. Après la recherche je pourrais venir avec ce très utile article.Stockage des baies dans la base de données en utilisant ActiveRecord

Maintenant, j'ai besoin d'utiliser GUI pour l'entrée & non seulement la console du serveur. Donc disons que j'ai un champ de texte appelé nums qui devrait logiquement avoir int array. Quel devrait être le format de nums de sorte qu'il devient facile de récupérer & stocker le tableau de cette chaîne?

+0

Dans Rails 4, vous pouvez maintenant utiliser le 'array' type, qui stocke comme un tableau sur PostgreSQL, ou comme une chaîne sur tout le reste. – Zaz

Répondre

35

Si vous utilisez serialize alors vous ne devriez pas avoir à vous soucier de la façon dont les données sont stockées dans le champ de texte, même si c'est en fait YAML.

serialize est décrite dans the Rails/ActiveRecord API (faites défiler jusqu'à la section intitulée « tableaux de Sauvegarde, hash, et d'autres objets non cartographiables dans les colonnes de texte »)

Pour l'affichage, vous avez besoin d'un format compréhensible pour les utilisateurs et cela peut être facilement converti en un tableau dans votre code. Comma- ou espace-délimité?

Mise en forme pour la sortie:

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

retransforme en un tableau pourrait fonctionner comme suit:

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

ou en utilisant peut-être cordes # scan?

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

Merci Mike. :) Je l'avais déjà compris. Un moyen encore plus facile (bien que sujet aux erreurs) est d'utiliser directement la fonction eval. donc: num_array = eval (nums) travail doux aussi! –

+3

C'est plus simple, mais si vous voulez utiliser eval, vous devez nettoyer les données pour des entrées non valides. eval() ouvre une tonne de trous de sécurité si vous ne faites pas attention. – MunkiPhD

13

Si vous utilisez postgres et rails 4, vous avez maintenant une meilleure option native.

# 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

Questions connexes