2011-10-18 26 views
5

Các đá quý vết đen mặt trời cho Solr có một phương pháp mà đòi hỏi một khối với 2 yếu tố:Tiêm với nhiều tham số khối

search.each_hit_with_result do |hit,result| 

và tôi đang sử dụng nó để xây dựng một băm mới của kết quả như sau:

results = Hash.new 

search.each_hit_with_result do |hit,result| 
    results[result.category.title] = hit.score 
end 

Điều này là tuyệt vời và tất cả mọi thứ nhưng tôi không thể không nghĩ rằng có một cách 'ruby' hơn để làm điều đó và tôi đã nhìn vào phương pháp tuyệt vời inject. Tôi nghĩ rằng một cái gì đó như sau nên có thể nhưng tôi không thể làm cho nó hoạt động cú pháp. Bất cứ ai có bất kỳ ý tưởng?

search.each_hit_with_result.inject({}) 
{|newhash,|hit,result||newhash[result.category.title]=hit.score} 
+0

Tìm kiếm bản đồ thành một mảng tiêu đề và ghi 2 mảng phần tử, sau đó sử dụng 'Hash [foo]' trên mảng mảng đó. Tôi sẽ viết điều này như một câu trả lời đúng vào ngày hôm nay. –

+0

Nevermind, tokland đánh tôi với nó! –

Trả lời

1

Object#enum_for được thiết kế chính xác cho việc này:

hit_results = search.enum_for(:each_hit_with_result) 
results = Hash[hit_results.map { |hit, res| [res.category.title, hit.score] }] 

Theo tôi, mã không bao giờ nên vạch trần each_xyz phương pháp, họ khuyến khích đang có mùi bắt buộc (như bạn một cách đúng đắn phát hiện). Đó là loại phương pháp có thể hiểu được khi không có enumerators và bạn cần phải trả lại dữ liệu một cách uể oải, nhưng bây giờ nó phải được coi là một mô hình chống. Họ phải trả lại một số đếm hoặc liệt kê và cho phép người dùng quyết định cách sử dụng nó.

2

tôi tin rằng phương pháp mà trông giống như những gì bạn muốn:

search.each_hit_with_result.inject({}) { |new_hash, current| new_hash[current[0]] = current[1]; new_hash } 

Hy vọng sự giúp đỡ của bạn.

+0

Có. Kiểm tra nhanh mà không có SOLR: Hash.inject có vẻ hoạt động giống như mỗi phương thức * trong đó nó vượt qua 2 args. Vì vậy: {1 => 2, 3 => 4} .inject ({}) {| new_hash, hiện tại | new_hash [current [0]] = current [1]; new_hash} – inger

+1

Bạn có thể sử dụng each_with_object thay vì tiêm. –

Các vấn đề liên quan