收集与记录ruby匹配的哈希数组

时间:2014-08-14 10:20:00

标签: ruby-on-rails ruby arrays

我有一系列哈希,其中包含各种记录。我有一个值,我希望与该数组交叉引用,如果匹配,请拉出该记录并使用它。

>> 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

我相信有更有说服力的方法可以做到这一点。我只是在学习

1 个答案:

答案 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 }