【问题标题】:How to do without delete_if for Active Record?Active Record 没有 delete_if 怎么办?
【发布时间】:2018-05-07 10:52:51
【问题描述】:

当我这样做时:

apartments = Apartment.where(apart_params).delete_if{|x| x.floor == x.max_floor }

Ruby 的数组方法delete_if 在 Active Record Relation 对象上的结果

NoMethodError (undefined method `delete_if' for #<Apartment::ActiveRecord_Relation:0x00000006d84ea0>
Did you mean?  delete
               delete_all):

我不明白它为什么会发生 - 这个对象似乎像普通数组一样响应......

除了使用普通的 each do 块之外,还有什么更聪明的选择吗?

也许您可以提供一个建议,让您可以通过智能 SQL (postgres) 查询来拒绝位于最后一层的公寓?

【问题讨论】:

    标签: sql ruby-on-rails arrays activerecord


    【解决方案1】:

    可以将关系转换为数组,然后可以调用delete_if

    Apartment.where(apart_params).to_a.delete_if {|x| x.floor == x.max_floor }
    

    关于更智能的方法,这取决于 floormax_floor 方法是否是列。如果是,那么:

    Apartment.where(apart_params).where.not("floor = max_floor")
    

    【讨论】:

    • 太棒了!谢谢!
    • 警告,这将从数据库中删除记录。
    【解决方案2】:

    我建议将您的 apartments 分配转换为以下内容:

    apartments = Apartment.where(apart_params).map{|x| x.floor == x.max_floor ? x.delete : x }

    【讨论】:

      【解决方案3】:

      即使Apartment.where(apart_params) 看起来像一个数组对象,它也不是!正如错误所说,它返回一个 ActiveRecordRelation,它不是一个数组。所以,如果你想在 ActiveRecordRelation 上使用数组方法,你必须将你的对象转换为带有to_a的数组

      apartments = Apartment.where(apart_params).to_a.delete_if{|x| x.floor == x.max_floor }
      

      【讨论】:

      • 我希望我能在两个答案上打勾...谢谢!
      猜你喜欢
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多