【问题标题】:How to save array in Active Admin Rails 4?如何在 Active Admin Rails 4 中保存数组?
【发布时间】:2013-10-22 13:42:00
【问题描述】:

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

谢谢

【问题讨论】:

  • 数组类型?您使用的是哪个数据库服务器?
  • 是的,Postgres 服务器 9.1
  • 对不起,我的问题已经正确阅读了吗???我正在尝试通过活动管理员保存它。
  • 啊,不。我没有正确阅读。但无论如何,一些谷歌搜索显示目前似乎不支持此功能:github.com/gregbell/active_admin/issues/2064

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


【解决方案1】:

你有破解的东西,因为活跃的管理员不支持开箱即用,似乎。

虽然这个答案很旧,但它有效:How do you handle serialized edit fields in an Active Admin resource?

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

# 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

【讨论】:

  • [新版本] 只是为了帮助其他人的更新,活动记录 >=4.1 和原生数组字段(即支持数组列的数据库)不使用序列化。参考github.com/rails/rails/issues/29498
【解决方案2】:

如果您不需要管理员的精美 UI,这里有一个类似但更简单的解决方案。

# 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
      

      将 setter 方法扩展到您的模型

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

      让你的数组列默认为[],它总是被一个空数组填充

      【讨论】:

        【解决方案5】:

        我的解决方案如下所示:

        我的迁移

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-22
          • 2015-11-30
          • 1970-01-01
          • 2013-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多