1

1 つのテーブルのヘッダーと値を動的に作成するためにgem 動的属性を使用しています

additional_fields は、動的属性を使用しているモデルです

class AdditionalField < ActiveRecord::Base
  has_dynamic_attributes :destroy_dynamic_attribute_for_nil => true
  belongs_to :user
end

dynamic_attributes列の追加のフィールド テーブルでは、すべてのデータが次のようにハッシュに格納されます

{"field_blood_group" => "B positive","field_age" => "22"}

フィールドの値が空白の場合に作成している間は、テーブルに追加されないことを意味しますが、ユーザーの編集中に問題が発生し、それらのフィールドの値を削除すると更新すると、テーブルから削除されず、次のようにデータベースに保存されます

{"field_blood_group" => "B positive","field_age" => ""}

代わりに、null 値を持つフィールドを削除したいので、次のように保存する必要があります。

{"field_blood_group" => "B positive"}

これを行う方法がわかりません。これで打たれました。誰か助けてください。

4

2 に答える 2

2

私はこれに対する解決策を見つけます

テーブルを更新する前に、値が空白かどうかを確認しています。値が空白の場合は、値を nil に置き換え、データベースから削除されていることを意味します

params[:additional_field] = {"field_blood_group" => "B positive","field_age" => ""}

for field in params[:additional_field]
 field[1] = field[1].blank? ? nil : field[1]
 @user.additonal_field.update_attribute(field[0],field[1])
end

しかし、作成中にこの動作原理bcozについて混乱しています。その値が空白かどうかを確認していません

値がnullの場合、作成中にデータベースに作成されません.作成後、値を削除すると、データベースから削除されないため、手動で値にnullを指定して削除されます

役に立ちます ありがとう

于 2012-11-20T05:19:34.330 に答える
1

おそらくインターフェースから空の文字列を取得しているので、それが!= nilgemによって保持されます。あなたは次のようなことを試みることができます:

after_validation do |record|
  dynamic = record.methods.each do |m| 
    if has_dynamic_attribute?( m ) and record.read_attribute( m ) == ''
      record.update_attribute m, nil 
    end
  end
end

after_validationgemはbefore_saveフックのnil属性で魔法をかけているので、コールバックでそれを行います。ActiveRecordコールバックの詳細をご覧ください。

編集:質問者からのフィードバックの後、より一般的。

于 2012-11-19T08:47:53.957 に答える