我在 Rails 4 中使用 Active Admin。在我的模型中,当我创建它在后台传递的对象时,我有一个字段是 Postgres 数组类型,但它没有保存到数据库中。所以我需要做的是通过 Active Admin 将数组字段保存在数据库中。
谢谢
我在 Rails 4 中使用 Active Admin。在我的模型中,当我创建它在后台传递的对象时,我有一个字段是 Postgres 数组类型,但它没有保存到数据库中。所以我需要做的是通过 Active Admin 将数组字段保存在数据库中。
谢谢
你有黑客的东西,因为活跃的管理员不支持开箱即用,似乎。
虽然这个答案很旧,但它有效:如何处理 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
如果您不需要管理员的精美 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
我发现的简单技巧:
由于 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
如果您不需要一些花哨的形式进行编辑,可以使用的简单解决方案
编写可用于任何模型的 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
使您的数组列默认为[]
,它将始终由一个空数组填充
这是我的解决方案的样子:
我的迁移:
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(' ')
函数设置为空格,因此它将按空格排列的项目分开,但您也可以使用逗号...