从内存中集合中删除项目

时间:2016-08-01 15:27:44

标签: ruby-on-rails ruby

我有一个包含类似的类的集合:

| id | user     | pass  | role (FK) |
|----|----------|-------|-----------|
| 1  | peter    | hash1 | 1,2       | <-- 2 foreign keys
| 2  | jennifer | hash2 | 2         |

位置类有一个属性:code

如果代码==&#34;未使用&#34;我想从集合中删除一个项目。

我可以在ruby中使用多少种不同的方法?

我目前正在这样做:

locations = Location.all

class Location < ActiveRecord::Base
end

这很有效但只是想知道我还能用其他方式做些什么只是为了学习目的(如果以另一种方式获得很大的性能优势,那么也很好)。

更新的 请忽略我最初从数据库加载我的集合的事实,这不是重点。我想学习如何删除内存中的内容而不是简单的子句:)

2 个答案:

答案 0 :(得分:3)

您只需从数据库中获取所需内容:

Rails 4以后:

locations = Location.where.not(code: "unused")

在Rails 4之前:

locations = Location.where("code != ?", "unused")

<小时/> 如果您有一个集合,并且想要reject一些项目,那么您可以试试这个:

locations.reject! {|location| location.code != "unused"} 

答案 1 :(得分:1)

你这样做是错误的。在您的情况下,您正在从DB检索所有记录并获取记录数组。然后,您正在寻找阵列中所需的记录。相反,您应该直接从DB获取记录:

 Location.where("code != 'unused'")
 # or in Rails 4 and latest
 Location.where.not(code: "unused")

如果您需要从DB中删除记录,可以这样做:

Location.where.not(code: "unused").destroy_all

如果您只是想知道从现有阵列中删除元素的最佳方法是什么,我认为您走在了正确的轨道上。除select外,还有rejectreject!delete_if方法。您可以在文档http://ruby-doc.org/core-2.3.1/Array.html

中了解有关它们的更多信息

有相关帖子可能会提供更多信息:Ruby .reject! vs .delete_if