我有一系列哈希,其中包含各种记录。我有一个值,我希望与该数组交叉引用,如果匹配,请拉出该记录并使用它。
>> concurrent_jobs.job_products
=> #<ActiveRecord::Associations::CollectionProxy [#<JobProduct id: 365, job_id: 91, product_id: 181, quantity: 3, frozen_cache: {}, created_at: "2014-08-13 15:54:21", updated_at: "2014-08-14 09:56:37">, #<JobProduct id: 366, job_id: 91, product_id: 363, quantity: 1, frozen_cache: {}, created_at: "2014-08-13 16:02:40", updated_at: "2014-08-13 16:02:40">]>
所以,让我们在上面的数组中说我想收集匹配product_id: 363
的整个记录,然后开始使用其他信息,如数量等。我该怎么办?
这是我到目前为止所写的方法
def product_quantity_in_current_unconfirmed_jobs(concurrent_jobs, original_product)
concurrent_jobs.job_products.map do |x|
b = x.product.id
if b == original_product.id
raise
end
end
end
我相信有更有说服力的方法可以做到这一点。我只是在学习
答案 0 :(得分:2)
假设这是一个ActiveRecord关联,您可能只想直接查询关联:
concurrent_jobs.job_products.where(product_id: 363).first
这将执行一个SQL查询以返回该一条记录(您可以通过拖尾log / development.log来查看该查询),而不是返回所有记录并强制您在应用程序中迭代它们。
那就是说,在一般情况下,如果这不是ActiveRecord并且你有一个哈希数组,你可以使用Enumerable#select(以获取所有匹配的记录)或Enumerable#detect(抓住第一个匹配记录):
matching_records = array.select {|entry| entry[:product_id] == 363 }
或:
first_matching_record = array.detect {|entry| entry[:product_id] == 363 }