【问题标题】:Remove/skip few objects from ActiveRecord_Relation collection in rails4从 Rails 4 中的 ActiveRecord 关系集合中删除/跳过一些对象
【发布时间】:2018-06-06 10:30:28
【问题描述】:

如果你在 AR 集合上使用 select!,reject!,delete_if

@projects = Project.all(有 3 条状态列值为“失败”的记录)

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

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

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

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

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

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    • 是的,同意。但仅通过where 无法达到我的预期结果,需要对 AR 集合进行操作,它应该返回 AR 集合而不是数组。
    • @Rajuakula 你问 - 我回答了。提出一个显示具体问题的新问题,以便您得到具体的答案。
    • @Rajuakula 同样,我注意到您从不接受您的问题的答案 - 如果它们对您有用,我建议您开始接受正确的答案 - 这样您就可以让社区知道您的问题已经解决。
    • 它不能解决我的问题。 @projects.reject!{|p| p.status='failed'} 也将类返回为ActiveRecord::Relation。如果它解决了我的问题,当然肯定会接受正确的答案。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多