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" => ""}

相反,我想删除具有空值的字段,它应该存储为

{"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 在创建时感到困惑我没有检查它的值是否为空白

创建时,如果值为空,则不会在数据库中创建它。创建后,如果我们删除该值意味着它不会从数据库中删除,所以我现在手动为该值提供空值,现在它被删除了

会有用的 谢谢

于 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_validation回调中执行此操作,因为 gem 正在使用before_save钩子中的 nil 属性发挥其魔力。阅读有关ActiveRecord 回调的更多信息。

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

于 2012-11-19T08:47:53.957 回答