Как сохранить массив в Active Admin Rails 4?
Я использую Active Admin в Rails 4. В моей модели у меня есть одно поле, которое является типом массива Postgres, когда я создаю объект, который он передает в фоновом режиме, но он не сохраняется в базе данных. Итак, что мне нужно сделать, чтобы сохранить поле массива в базе данных через Active Admin.
Спасибо
Ответы
Ответ 1
У вас есть хак, потому что активный администратор не поддерживает его из коробки. Кажется.
Хотя этот ответ старый, он работает: Как вы обрабатываете сериализованные поля редактирования в ресурсе Active Admin?
Вот краткое описание того, как я справлялся с этой ситуацией. Я добавил аксессуар к модели, которая может превратить Array в строку, соединенную с помощью строки и отделить ее от массива.
# app/models/domain.rb
class Domain < ActiveRecord::Base
serialize :names, Array
attr_accessor :names_raw
def names_raw
self.names.join("\n") unless self.names.nil?
end
def names_raw=(values)
self.names = []
self.names=values.split("\n")
end
end
то в моем ресурсе admin для домена вместо использования поля: names я использовал поле: names_raw. это значение сохранит имена Array с новыми значениями.
# app/admin/domains.rb
form do |f|
f.inputs "Domain" do
f.input :names_raw, :as => :text
end
f.buttons
end
Ответ 2
Здесь аналогичный, но даже более простой подход к решению, если вам не нужен модный интерфейс для администратора.
# app/model/thing.rb
def some_array_column= items
if items.is_a? String
super items.split(" ")
else
super items
end
end
и
# app/admin/thing.rb
ActiveAdmin.register Thing do
index do
column "Things" { |t| (t.some_array_column || []).join(" ") }
end
end
Ответ 3
Простой взлом, который я нашел:
Поскольку Postgres рассматривает массивы как text
вы можете оставить для него вход по умолчанию и просто проанализировать параметры, как если бы это был какой-то json
.
# app/admin/model.rb
controller do
def update
params[:model][:array_attribute] = JSON.parse params[:model][:array_attribute]
super
end
end
Советы: установите для атрибута массива значение по умолчанию []
чтобы ваш ввод уже был заполнен пустым массивом. Вы также можете настроить свой ввод, как если бы он был json для лучшего редактирования см. Https://github.com/udacity/activeadmin_json_editor
Ответ 4
Простое решение, которое можно использовать, если вам не нужна какая-то необычная форма для редактирования
Напишите модуль метода Setter, который можно использовать на любой модели
module StringToArrayValueSetter
def string_to_array_setter(*column_names)
column_names.each do |column_name|
define_method("#{column_name}=") do |val|
value = val.is_a?(String) ? YAML.load(val) : val
super value
end
end
end
end
Расширьте метод установки на вашу модель
class Thing < ApplicationRecord
extend StringToArrayValueSetter
string_to_array_setter :column1, :column2
end
установите для столбца массива значение по умолчанию []
, он всегда будет заполнен пустым массивом