Как сохранить массив в Active Admin Rails 4?

Я использую Active Admin в Rails 4. В моей модели у меня есть одно поле, которое является типом массива Postgres, когда я создаю объект, который он передает в фоновом режиме, но не сохраняет в базе данных. Итак, что мне нужно сделать, чтобы сохранить поле массива в базе данных через Active Admin.

Спасибо


person Mohd Anas    schedule 22.10.2013    source источник
comment
тип массива? какой сервер базы данных вы используете?   -  person phoet    schedule 22.10.2013
comment
да, сервер Postgres 9.1   -  person Mohd Anas    schedule 23.10.2013
comment
Извините, правильно прочитали мой вопрос??? Я пытаюсь сохранить его через активного администратора.   -  person Mohd Anas    schedule 23.10.2013
comment
ааа, нет. я не прочитал это должным образом. но, тем не менее, некоторые поисковые запросы показывают, что сейчас это не поддерживается: github.com /gregbell/active_admin/issues/2064   -  person phoet    schedule 23.10.2013


Ответы (5)


У вас есть хак, так как активный админ не поддерживает его из коробки, похоже.

Хотя этот ответ устарел, он работает: Как вы обрабатываете сериализованные поля редактирования в ресурсе Active Admin?

Вот краткое изложение того, как я справился с этой ситуацией. Я добавил к модели метод доступа, который может превратить массив в строку, соединенную переводом строки, и разделить ее обратно на массив.

# 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

затем в моем административном ресурсе для домена вместо использования поля :names я использовал поле :names_raw. установка этого значения сохранит массив имен с новыми значениями.

# app/admin/domains.rb
form do |f|
  f.inputs "Domain" do
    f.input :names_raw, :as => :text
  end
  f.actions
end
person vedant    schedule 22.12.2014
comment
[Новая версия] Просто обновление для помощи коллегам, с активными записями ›=4.1 и собственными полями массива (т.е. база данных, которая поддерживает столбцы массива) не использует сериализацию. Ссылка github.com/rails/rails/issues/29498 - person imsinu9; 11.03.2018

Вот похожее, но еще более простое решение, если вам не нужен причудливый пользовательский интерфейс для администратора.

# 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
person Jordan Sitkin    schedule 09.06.2017

Простой хак, который я нашел:

Поскольку 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

person adesurirey    schedule 28.10.2018

Простое решение, которое можно использовать, если вам не нужна какая-то замысловатая форма для редактирования.

Напишите модуль метода 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

Расширьте метод setter для вашей модели

class Thing < ApplicationRecord
   extend StringToArrayValueSetter
   string_to_array_setter :column1, :column2
end

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

person ShilpeshAgre    schedule 01.05.2019

Вот как выглядит мое решение:

Моя миграция:

  def change
    add_column :agency_services, :required_fields, :string, array: true, default: []
  end

Модель ресурсов активного администратора:

  permit_params [required_fields: []]

  controller do
    def update
      params[:agency_service][:required_fields] = params[:agency_service][:required_fields].split(' ')
      super
    end
  end

И как я форматирую каждый отдельный элемент, предназначенный для установки в виде массива:

occupation home_number work_number

впоследствии это заканчивается переводом на это:

[occupation, home_number, work_number]

Поскольку я установил для функции String.split(' ') пробел, он разделяет элементы, которые должны быть выстроены пробелами, но вы также можете использовать запятую...

person Aaron Rory    schedule 10.02.2021