2010-11-22 35 views
22

Làm thế nào để chuyển đổi các resultset của @ recipe.components.find ([# < Component ingredient_id: 1>, # <Component> ingredient_id: 2 >]) để một mảng như [1,2]Làm thế nào để chuyển đổi một mảng kết quả ActiveRecord thành một mảng bình thường?

<% @ingredients.each do |ingredient| %> 
    <div class="field"> 
    <%= check_box_tag 'ingredients[]', ingredient.id, @recipe.components.find(:all, :select => "ingredient_id").include?(ingredient.id) %><%= ingredient.name %> 
    </div> 
<% end %> 

Cảm ơn!

Trả lời

31

bạn có thể sử dụng

@result.map {|i| i.ingredient_id } 
+0

Cảm ơn! Tôi cần @ result.map! {| i | i.ingredient_id} – Spechal

+0

'map' là bạn của bạn. Ngoài ra, hãy tìm hiểu ba "ect": 'select',' reject' và 'inject'. –

24

Nếu bạn đang sử dụng một phiên bản gần đây của ruby ​​hơn, có cách mới để làm điều này:

@result.map(&:ingredient_id) 

Thời gian tiết kiệm, sạch sẽ và dễ hiểu.

+9

Có vẻ như Ruby đang có nhiều khả năng khó hiểu hơn. – Spechal

+1

@Spechal nó không phải là khó hiểu! Đơn giản chỉ cần đặt, phương thức bản đồ cho thấy giao diện liệt kê cơ bản cho bất kỳ mảng, băm, v.v. "&" chỉ là ký hiệu ngắn khi bạn muốn gửi/kích hoạt một phương thức đơn trên mỗi đối tượng trong mảng. Và trong trường hợp này,: component_id là biểu diễn ký hiệu của phương thức. –

+3

@Spechal Oh và tôi quên đề cập đến, nếu bạn đang sử dụng Rails 3.2.x thì có một phương pháp đơn giản hơn! Chỉ cần gọi MyModel.find (* conditions *). Pluck (&: component_id) ... điều này nhanh hơn nhiều vì phương pháp pluck về cơ bản là một cột duy nhất được chọn để bạn không mất thời gian tìm nạp tất cả dữ liệu, tất nhiên là bạn chỉ muốn các giá trị trong một cột duy nhất! –

5

Bạn cũng có thể sử dụng:

@result.pluck(:ingredient_id) 
Các vấn đề liên quan