从rails4中的ActiveRecord_Relation集合中删除/跳过一些对象

时间:2018-06-06 10:30:28

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord rails-activerecord

如果您在AR集合中使用select!,reject!,delete_if

@projects = Project.all(有3条记录,状态列值为#39;失败')

@projects.reject!{|p| p.status=="failed"} (has 0 records now)

但是@projects.count =>结果为3仍然

表示如果我们尝试对仍在使用旧集合的@projects进行查询(3条记录)。

有什么建议吗?为什么它使用旧的集合已经通过拒绝操作过滤它。并且不希望它使用旧的AR集合。

使用AR where,我们可以实现它,但在我的情况下,使用where只能实现我的结果,并且需要对AR集合进行一些操作,它应该只返回AR而不是Array。

1 个答案:

答案 0 :(得分:1)

您最好使用ActiveRecord::QueryMethods#where

@project.where.not(status: :failed)

@projects.class会返回一个ActiveRecord::Relation对象,该对象未实现reject!方法,因此您无法修改"它在你尝试的时候。无论如何,能够这样做是没有意义的。

编辑:(自OP编辑以来)

我相信你的事情可以通过使用查询界面来实现,但由于你无法提供具体的例子,这是一种无效的方法,但为什么你会关心效率呢?

project_ids = @projects.reject { |p| p.status == "failed" }.map(&:id)
new_at_collection = Product.where(id: project_ids)