Rails 4 で Active Admin を使用しています。私のモデルには、バックグラウンドで渡されるオブジェクトを作成するときに Postgres 配列型のフィールドが 1 つありますが、データベースには保存されません。Active Adminを介してデータベースに配列フィールドを保存するには、どうすればよいですか。
ありがとう
Rails 4 で Active Admin を使用しています。私のモデルには、バックグラウンドで渡されるオブジェクトを作成するときに Postgres 配列型のフィールドが 1 つありますが、データベースには保存されません。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 フィールドを使用しました。この値を設定すると、names Array が新しい値で保存されます。
# app/admin/domains.rb
form do |f|
f.inputs "Domain" do
f.input :names_raw, :as => :text
end
f.actions
end
編集に派手なフォームが必要ない場合に使用できるシンプルなソリューション
任意のモデルで使用できる 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
配列の列のデフォルトを[]
にします。常に空の配列で埋められます