如果值为空,如何从动态属性表中删除字段意味着什么?

时间:2012-11-19 05:22:57

标签: ruby-on-rails ruby

我正在使用 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" => ""}

我希望删除具有空值的字段,它应该存储为

{"field_blood_group" => "B positive"}

我不知道怎么做这件事让我感到震惊 任何人都可以帮助我

2 个答案:

答案 0 :(得分: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感到困惑,同时创建我没有检查它的值是否为空白

创建它时,如果value为null则不会在数据库中创建。在创建之后,如果我们删除该值意味着它不从数据库中删除,那么我现在手动为该值提供null,现在将其删除

它会很有用 谢谢

答案 1 :(得分:1)

你可能从你的界面得到一个空字符串,因为那是!= nil宝石会保留它。您可以尝试执行以下操作:

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_validation回调中执行此操作,因为gem正在使用before_save挂钩中的nil属性进行魔术。详细了解ActiveRecord callbacks

编辑:在提问者反馈后更通用。