通过.includes从活动记录中删除属性

时间:2017-07-31 19:01:21

标签: ruby ruby-on-rails-4

在尝试做一件非常简单的事情时,我遇到了一个非常奇怪的问题。我正在做一个.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

1 个答案:

答案 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仅对哈希中已更改的字段执行插入。