Добавить столбец массива в 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
Спасибо.