Ruby on rails 如何使序列化列为空?

Ruby on rails 如何使序列化列为空?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我在Company中有一个列,它被序列化为数组: class Company serialize :column_name, Array end 在rails控制台中,当我尝试以下操作时: existing = Company.last.column_name # it gives a array with single element, say [1] existing.delete(1) # now existing is [] Company.last.update_attribut

我在Company中有一个列,它被序列化为数组:

class Company
  serialize :column_name, Array
end
在rails控制台中,当我尝试以下操作时:

existing = Company.last.column_name
# it gives a array with single element, say [1]
existing.delete(1)
# now existing is []
Company.last.update_attributes!(column_name: existing)
# It empties the array, so:
Company.last.column_name #gives []
但是,当我在某个控制器的
remove
方法中尝试相同的代码时,它从未删除最后一个元素。它总是返回[1]

如何清空序列化列?

注意:-当我有多个元素时,此逻辑有效,但仅最后一个元素无效

控制器代码

def remove_restricted_num
  company = Company.where(id: params[:id]).first
  restricted_numbers = company.restricted_numbers
  num = params[:num].to_i

  if restricted_numbers.include?(num)
    restricted_numbers.delete(num)
    company.update_attributes!(restricted_numbers: restricted_numbers)

    render js: "alert('#{num} was removed')"
  else
    render js: "alert('Number not found in the list')"
  end
end

我得到了修复,我们需要使用
dup
来获得一个独立变量
现有的
,否则它引用的是
公司。last.column\u name

existing = Company.last.column_name.dup # THIS WORKS!!!
existing.delete(1)
Company.last.update_attributes!(column_name: existing)

这会根据我的需要将列更新为
[]

为什么不这样更新您的列:
company.column\u name=[];公司。保存
?@Stefan抱歉输入错误。我纠正了它。这是
delete
。您能否显示控制器的实际
remove
方法?有些代码在
rails控制台
中工作,但在您的控制器中不工作,这没有多大意义。@Stefan我添加了控制器代码,但没有
dup
当尝试删除最后一项时,代码的行为如何?它是否在没有实际删除的情况下呈现“…已删除”?这可能与ActiveRecord的“脏”跟踪有关。对字符串、数组或其他数据结构进行就地修改通常会使ActiveRecord认为没有任何更改,也没有对象引用被交换。只要可能,直接重新分配。不幸的是,这对我不起作用
c=Company.last
existing=c.column\u name.del(1)
c.column\u name=existing
c.save这是同一个对象:
存在。对象id
不会更改。你需要引入一个新对象。您的
dup
解决方案可以做到这一点,但是如果您希望清除该值,那么
c.column\u name=[]
是更好的方法。这使阅读代码的人更清楚地知道这是你的意图。@tadman我明白你的意思,这是正确的!!但是,唯一阻止我的是拥有一个通用代码。我的意思是,如果有更多的元素,逻辑就起作用了,但只有最后一个元素我不想用单独的条件检查,比如:
if existing.present?现有:[]
@tadman如果脏跟踪被破坏,它在任何情况下都不会工作,即在删除倒数第二个项目时,也不会在rails控制台中工作。