如果我的联系人数组(模型)包含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)
上面的行必须被调用数百次......我想通过数组迭代会更便宜。谢谢!
答案 0 :(得分:2)
最好的方法是将联系人ID作为密钥索引联系人,然后从db中检索所有联系人:
contacts = Contact.all.inject({}) {|hash, contact| hash[contact.id] = contact; hash }
然后,您可以轻松地以高效的方式与contact[id]
取得联系。
答案 1 :(得分: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 here is how you can do that调用它可能会更快。