1

如果我的联系人数组(模型)包含一个 id 等于某个值的联系人,我只想返回 true。例如:

@contacts = Contact.all

@someval = "alskjdf"

find_val(@contacts, @someval)

def find_val(contacts, val)
  @contact.each do |c|
    if c.id == val
      return true
    end
  end
  return false
end

我必须在我的应用程序中重复执行此操作(对于此特定操作最多大约 100 次),以便从具有联系人列表的外部 API 中排除一些数据。这会不会太贵了?

我想我可以做一些更快的事情,类似于从数据库中拉下后在阵列上找到的 ActiveRecord,但无法弄清楚。像这样调用 ActiveRecord 会不会太贵?

Contacts.find_by_id(@someval)

上面的行必须被调用数百次......我认为遍历数组会更便宜。谢谢!

4

2 回答 2

2

最好的方法是在哈希中索引联系人,在从数据库中检索所有联系人后,使用联系人 ID 作为键:

contacts = Contact.all.inject({}) {|hash, contact| hash[contact.id] = contact; hash }

然后,您可以轻松地以高效的contact[id]方式取得联系。

于 2012-06-29T00:01:05.740 回答
1

减少搜索数组所需编写的代码量的一种方法是打开数组类并创建一个自定义实例方法:

class Array
  def haz_value?(someval)
    if self.first.respond_to? :id
      self.select { |contact| contact.id == someval }.length > 0
    else
      false
    end
  end
end

然后,您可以调用@contacts.haz_value? @someval. 效率方面,我没有做过比较,但是两种方式都使用了Array的内置迭代器。在您的数据库中创建存储过程并通过 ActiveRecord 调用它可能会更快,这是您可以做到的

于 2012-06-29T00:01:21.840 回答