我正在使用 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"}
我不知道怎么做这件事让我感到震惊 任何人都可以帮助我
答案 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。
编辑:在提问者反馈后更通用。