如何在对象内部持久更改数组?

时间:2012-05-06 18:13:27

标签: ruby-on-rails ruby mongoid

我有一系列位于产品对象内的历史记录项:

 class Product
    include Mongoid::Document
    include Mongoid::Paranoia
    include Mongoid::Timestamps

    ...
    embeds_many :modification_histories

我的商业规则是只保存了最后120个历史记录。所以当添加一个新的时,我会对旧的那些进行排序并弹出数组:

if self.modification_histories.size >= 120
   self.modification_histories.sort! { |x,y| y.date <=> x.date  }
  while self.modification_histories.size >= 120
     self.modification_histories.pop
  end
end

这似乎工作正常,我在调用该方法后设置了断点,历史数组的大小正确。但是当我保存对象(self.save!)然后重新加载它时,历史数组没有被更改。我不明白我做错了什么。

gem "mongoid", "~> 2.4"

2 个答案:

答案 0 :(得分:0)

简答:将数组复制到另一个数组中。而不是:

self.modification_histories.sort! { |x,y| y.date <=> x.date }

arr = self.modification_histories.sort { |x,y| y.date <=> x.date  }
while arr.size >= 120
    arr.pop
end
self.modification_histories = arr

答案 1 :(得分:0)

你也可以将它压缩成一行:

self.update_attribute(:modification_histories, self.modification_histories.sort{ |x,y| y.date <=> x.date }[0...120])