如何在Active Admin Rails 4中保存数组?

时间:2013-10-22 13:42:01

标签: arrays model ruby-on-rails-4 activeadmin ruby-2.0

我在Rails 4中使用Active Admin。在我的模型中,我有一个字段是Postgres数组类型,当我创建它在后台传递的对象但它没有保存到数据库。那么我需要做什么来通过Active Admin将数组字段保存在数据库中。

由于

5 个答案:

答案 0 :(得分:9)

你有黑客的东西,因为主动管理员不支持开箱即用,似乎。

虽然这个答案很老,但它的作用是:How do you handle serialized edit fields in an Active Admin resource?

  

以下是我如何处理这种情况的摘要。我在模型中添加了一个访问器,它可以将Array转换为由换行符连接的字符串,并将其拆分回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
  

然后,在我的域管理资源中,我使用了:names_raw字段,而不是使用:names字段。设置此值将使用新值保存名称Array。

# app/admin/domains.rb
form do |f|
  f.inputs "Domain" do
    f.input :names_raw, :as => :text
  end
  f.buttons
end

答案 1 :(得分:4)

如果您不需要为管理员提供精美的用户界面,那么这里有一个类似但更简单的解决方案。

# 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

答案 2 :(得分:0)

我发现了一个简单的技巧:

由于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

答案 3 :(得分:0)

如果您不需要一些精美的表格来进行编辑,则可以使用简单的解决方案

编写一个可以在任何模型上使用的Setter方法模块

FROM image AS foo
...
...

FROM foo AS bar
...
...

FROM foo
COPY --from=bar

将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 ,它将始终由一个空数组填充

答案 4 :(得分:0)

这是我的解决方案的样子:

我的迁移

  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(' ') 函数设置为空格,因此它将要按空格排列的项目分开,但您也可以使用逗号...