13

Rails 4 で Active Admin を使用しています。私のモデルには、バックグラウンドで渡されるオブジェクトを作成するときに Postgres 配列型のフィールドが 1 つありますが、データベースには保存されません。Active Adminを介してデータベースに配列フィールドを保存するには、どうすればよいですか。

ありがとう

4

5 に答える 5

15

アクティブな管理者はそのままではサポートしていないため、ハッキングされているようです。

この回答は古いですが、機能します: 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
于 2014-12-22T17:23:47.117 に答える
0

編集に派手なフォームが必要ない場合に使用できるシンプルなソリューション

任意のモデルで使用できる 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

配列の列のデフォルトを[]にします。常に空の配列で埋められます

于 2019-05-01T19:16:53.933 に答える