如果您在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。
答案 0 :(得分:1)
您最好使用ActiveRecord::QueryMethods#where
:
@project.where.not(status: :failed)
@projects.class
会返回一个ActiveRecord::Relation
对象,该对象未实现reject!
方法,因此您无法修改"它在你尝试的时候。无论如何,能够这样做是没有意义的。
我相信你的事情可以通过使用查询界面来实现,但由于你无法提供具体的例子,这是一种无效的方法,但为什么你会关心效率呢?
project_ids = @projects.reject { |p| p.status == "failed" }.map(&:id)
new_at_collection = Product.where(id: project_ids)