从ActiveRecord_Associations_CollectionProxy中删除记录

时间:2015-12-03 21:13:48

标签: ruby-on-rails ruby activerecord collections

Rails:4.2

Ruby:2.2.3

我在模型中使用表现,其类别为:Performance :: ActiveRecord_Associations_CollectionProxy

在从Rails 2升级到Rails 4之前,此方法有效:

def remove_expired_performances
  performances.reject! {|performance| performance.date < Date.today}
end

现在,我收到了拒绝的错误!是ActiveRecord_Associations_CollectionProxy的无效方法。这是有道理的,因为此处未列出拒绝:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html

Rails 4中最干净的方法是什么,我可以获得相同的结果(从集合中删除比现在更早的日期的记录)?

注意:我需要将对象保持为ActiveRecord_Associations_CollectionProxy并命名为 performance

1 个答案:

答案 0 :(得分:1)

我假设您的模型has_many :performances

class Orchestra < ActiveRecord::Base
  has_many :performances
end

我认为最简单的解决方案是将performances转换为数组并拒绝已过期的数据。

# class Orchestra
def remove_expired_performances
  performances.to_a.reject {|performance| performance.date < Date.today}
end

更有效的解决方案可能是首先避免将过期的Performance从数据库中拉出来。

# in wherever your finder code lives
@performances = Orchestra.find(params[:id]).performances.where('date >= ?', Date.today)