Хранение массивов в базе данных с использованием ActiveRecord - PullRequest
23 голосов
/ 23 июня 2010

Я на рельсах 2.3.8 и использую mysql в качестве адаптера БД. Я хочу хранить массивы в моей базе данных. После поиска я смог придумать эту очень полезную статью .

Теперь мне нужно использовать графический интерфейс для ввода, а не только консоль сервера. Скажем, у меня есть текстовое поле с именем nums, которое по логике должно иметь массив int. Каким должен быть формат чисел, чтобы было легко извлечь и сохранить массив из этой строки?

Ответы [ 2 ]

35 голосов
/ 23 июня 2010

Если вы используете serialize, вам не нужно беспокоиться о том, как данные хранятся в текстовом поле, хотя на самом деле это YAML.

serialize задокументировано в API Rails / ActiveRecord (прокрутите вниз до раздела, озаглавленного «Сохранение массивов, хэшей и других не отображаемых объектов в текстовых столбцах»)

Для отображения вам нужен формат, который понятен пользователям и который можно легко преобразовать обратно в массив в вашем коде. Запятая или пробел?

Форматирование для вывода:

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

Преобразование обратно в массив может работать следующим образом:

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

или, возможно, с помощью String # scan?

num_array = nums.scan(/\d+/).map(&:to_i) # for positive integers
14 голосов
/ 05 марта 2015

Если вы используете postgres и rails 4, теперь у вас есть лучший вариант.

# 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...