Как сохранить массив в 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

установите для столбца массива значение по умолчанию [], он всегда будет заполнен пустым массивом