在尝试做一件非常简单的事情时,我遇到了一个非常奇怪的问题。我正在做一个.includes模型来从db获取一行数据。在返回对象上,我需要有条件地删除某些属性。最后的目标是根据我使用条件对属性所做的更改,将此行重新插入新记录。
def myUpdate
dbObj = Obj.includes(:name,
:addr1,
:addr2,
:state,
:description).find(params[:id])
#dbObjective.attributes().except('description')
#dbObjective.description = nil
#dbObjective.attributes().delete('description')
#after setting more attributes, persist this object
end
我尝试了所有我能想到的可能性,但该属性并未被删除。我错过了什么?我在轨道上4.2
这似乎非常简单,但似乎没有任何效果:(
请帮忙 Ananth
答案 0 :(得分:0)
includes
用于在查询中包含join
查询和急切加载的关联表,而不是表属性。您无需执行任何特殊操作即可访问对象的属性。
attributes
返回一个Hash
实例,其中包含记录的属性作为键值对,对其进行操作只会更改Hash
实例本身,而不会更改记录。
有几种方法可以更新属性。最简单的方法之一是使用setter
为您提供的内置ActiveRecord
方法。如果您真的想使用Hash
API更改属性,可以将attributes
哈希存储在变量中,操作哈希值,并将其作为参数传递给update
,它接受一个属性哈希作为它的论点。
setter
方法def myUpdate
dbObj = Obj.find(params[:id])
dbObj.description = 'new_description'
dbObj.name = 'new_name
dbObj.save
end
update
def myUpdate
dbObj = Obj.find(params[:id])
attributes = dbObj.attributes # This is how you would update the object by manipulating the attributes hash
attributes.delete(:description) # this will NOT end up changing the attribute in the DB
attributes[:name] = nil # this will successfully set name to NULL in the DB
dbObj.update(attributes) # pass the manipulated hash to the `update` method to persist the changes
end
散列中的 delete
字段不会对持久化对象产生影响。 update
仅对哈希中已更改的字段执行插入。