Question Ajouter une colonne de tableau dans Rails


Comment déclarez-vous une colonne de tableau dans Rails?

Détail

J'ai le modèle suivant

rails generate model User address:text

mais je veux un modèle capable de stocker plusieurs adresses par utilisateur. La déclaration suivante me donne une erreur

rails generate model User address[]:text 

Comment déclarez-vous une colonne de tableau dans Rails?


13
2017-09-05 05:29


origine


Réponses:


Vous pouvez utiliser les étapes suivantes

rails g migration add_subjects_to_book subjects:text

Et le fichier de migration:

class AddSubjectsToBook < ActiveRecord::Migration
  def change
    add_column :books, :subjects, :text, array:true, default: []
  end
end

Nous pouvons le vérifier maintenant:

2.1.2 :001 > b = Book.create
   (0.2ms)  BEGIN
  SQL (2.0ms)  INSERT INTO "books" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", "2014-10-17 08:21:17.870437"], ["updated_at", "2014-10-17 08:21:17.870437"]]
   (0.5ms)  COMMIT
 => #<Book id: "39abef75-56af-4ad5-8065-6b4d58729ee0", title: nil, created_at: "2014-10-17 08:21:17", updated_at: "2014-10-17 08:21:17", description: {}, metadata: {}, subjects: []>

2.1.2 :002 > b.subjects.class
 => Array

Si vous souhaitez ajouter un tableau en créant une table, vous pouvez procéder comme suit

create_table :products do |t|
  t.string :name, null: false
  t.references :category, null: false
  t.text :tags, array: true, default: []
end

16
2017-09-05 06:46



Si vous utilisez Postgres, alors cet article http://blog.plataformatec.com.br/2014/07/rails-4-and-postgresql-arrays/ suggère d'utiliser array: true option dans le script de migration:

create_table :users do |t|
  # other columns
  t.text : addresses, array: true, default: []
end

Si vous n'utilisez pas Postgres, cette réponse pourrait être utile: Stockage des tableaux dans la base de données: JSON vs tableau sérialisé


12
2017-09-05 05:32



Les exemples utilisant array: true nécessiterait Postgres ou une autre base de données capable d'un type de tableaux. Pour MySQL, utilisez la sérialisation générique, qui vous permet de stocker tout type arbitraire dans une colonne.

create_table :users do |t|
  t.text :addresses, default: [].to_yaml
  ...
end

class User < ActiveRecord::Migration
  serialize :addresses, Array
end

u = User.new
u.update_attributes addresses: ["123 Evergreen", "246 Main"]

Les mises en garde habituelles s’appliquent au stockage de tableaux dans une base de données. Cela va à l'encontre des bases de données relationnelles et cela rend difficile, lent ou impossible de faire des choses comme la recherche d'un élément individuel. Cependant, cela peut être une solution idéale pour le stockage de base jusqu'à ce que vous ayez besoin de faire ces choses.


9
2017-09-05 07:13