从rails中的ActiveRecord_Relation中删除元素

时间:2014-06-24 08:57:58

标签: ruby-on-rails activerecord

如何从rails中的ActiveRecord_Relation中删除最后一个元素?

e.g。如果我设置:

@drivers = Driver.all

我可以通过执行以下操作将另一个名为@new_driver的Driver对象添加到@drivers:

@drivers << @new_driver

但是如何从@drivers中删除对象?

删除方法似乎不起作用,即

@drivers.delete(0)

5 个答案:

答案 0 :(得分:6)

您可以使用reject!方法,这将从集合中删除对象而不影响db

例如:

driver_to_delete = @driver.first # you need the object that you want removed
@drivers.reject!{|driver| driver == driver_to_delete}

答案 1 :(得分:3)

问题的后期,但只是有同样的问题,并希望这有助于其他人。

reject!在Rails 4.2中不适用于ActiveRecord_Relation

drop(1)是解决方案

在这种情况下,@drivers.drop(0)将删除关系的第一个元素

答案 2 :(得分:1)

由于它是一个对象数组,你是否曾尝试编写类似@ drivers.delete(@new_driver)或@ drivers.delete(id:@ new_driver.id)的内容?

答案 3 :(得分:0)

This is the documentation you need

@group.avatars << Avatar.new
@group.avatars.delete(@group.avatars.last)

-

<强> .destroy

您遇到的问题是您尝试在非集合对象上使用collection方法。您需要使用.destroy ActiveRecord方法来删除数据库中的记录(以及随后的集合):

@drivers = Driver.all
@drivers.last.destroy

-

<强>范围

.delete将从数据库中删除记录

如果您想从数据库中提取特定元素以填充@drivers对象,则需要使用scope

#app/models/driver.rb
Class Driver < ActiveRecord::Base
   scope :your_scope, -> { where column: "value" }
end

这将允许您致电:

#app/controllers/drivers_controller.rb
def index
   @drivers = Driver.your_scope
end

我认为你让MVC programming pattern感到困惑 - 数据操作应该发生在model,而不是controller

答案 4 :(得分:0)

由于无法接受答案,因此这是Rails 5.2的解决方案

p + 
  scale_x_continuous(trans = 'log10', 
                     breaks = x_vec)