Хранение массивов в базе данных с помощью ActiveRecord
Я на рельсах 2.3.8, и я использую mysql в качестве адаптера db.
Я хочу хранить массивы в моей базе данных. После поиска я мог придумать эту очень полезную статью .
Теперь мне нужно использовать графический интерфейс для ввода, а не только консоль сервера. Так сказать, у меня есть текстовое поле, называемое nums, которое логически должно иметь int array. Каким должен быть формат nums, чтобы стало легко извлекать и хранить массив из этой строки?
Ответы
Ответ 1
Если вы используете serialize
, вам не придется беспокоиться о том, как данные хранятся в текстовом поле, хотя на самом деле это YAML.
serialize
задокументирован в Rails/ActiveRecord API (прокрутите вниз до раздела, озаглавленного "Сохранение массивов, хэшей и других не- отображаемые объекты в текстовых столбцах" )
Для отображения вам нужен формат, понятный для пользователей, и который можно легко преобразовать обратно в массив в вашем коде. Ограничено запятыми или пробелами?
Форматирование для вывода:
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
Ответ 2
Если вы используете 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