Добавить столбец массива в Rails

Как вы объявляете столбец массива в Rails?

подробность

У меня есть следующая модель

rails generate model User address:text

но я хочу модель, которая может хранить несколько адресов на пользователя. Следующая декларация дает мне ошибку

rails generate model User address[]:text 

Как вы объявляете столбец массива в Rails?

3 ответа

Вы можете использовать следующие шаги

rails g migration add_subjects_to_book subjects:text

И файл миграции:

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

Мы можем проверить это сейчас:

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

Если вы хотите добавить массив при создании таблицы, вы можете сделать следующее

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

Если вы используете Postgres, то этот пост http://blog.plataformatec.com.br/2014/07/rails-4-and-postgresql-arrays/ предлагает использовать array: true опция в скрипте миграции:

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

Если вы не используете Postgres, этот ответ может быть полезен: Хранение массивов в базе данных: JSON против сериализованного массива

Примеры использования array: true потребуется Postgres или какая-либо другая база данных, способная к типу массивов. Для MySQL используйте универсальную сериализацию, которая позволяет хранить любой столбец произвольного типа.

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"]

Обычные предостережения относятся к хранению массивов в базе данных. Это идет вразрез с реляционными базами данных, что затрудняет, замедляет или делает невозможным такие вещи, как поиск отдельного элемента. Тем не менее, это может быть хорошим решением для базового хранилища, пока вам не понадобятся эти вещи.

Если вы используете Rails 5, выполните следующие шаги, чтобы добавить массив адресов в пользовательскую таблицу:

Выполните команду ниже, чтобы создать модель с таблицей,

rails generate model User address:text

Таблица будет создана, как показано ниже:

class CreateUser < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.text :address
      t.timestamps
    end
  end
end

Теперь добавим сериализацию адреса в пользовательской модели.

class User < ApplicationRecord
 serialize :address, Array
end

Спасибо.

Другие вопросы по тегам