2009-06-10 25 views
5

Câu hỏi này khá đơn giản nhưng tôi đã gặp phải vấn đề này một vài lần.Làm thế nào để bạn lặp qua các đối tượng bản ghi đang hoạt động trong Ruby On Rails?

Hãy nói rằng bạn làm điều gì đó như:

cars = Vehicle.find_by_num_wheels(4) 

cars.each do |c| 
    puts "#{c.inspect}" 
end 

này hoạt động tốt nếu xe là một mảng nhưng thất bại nếu chỉ có một chiếc xe trong cơ sở dữ liệu. Rõ ràng tôi có thể làm một cái gì đó như "if! Cars.length.nil?" hoặc kiểm tra một số cách khác nếu đối tượng ô tô là một mảng trước khi gọi .each, nhưng đó là một chút khó chịu để làm mọi lúc.

Có điều gì tương tự .each xử lý kiểm tra này cho bạn không? Hoặc là có một cách dễ dàng để buộc kết quả truy vấn vào một mảng bất kể kích thước?

Trả lời

12

Bạn có thể tìm kiếm

cars = Vehicle.find_all_by_num_wheels(4) 

Các find_by_ phương pháp năng động chỉ trả lại một phần tử và bạn phải sử dụng find_all_by_ để trả lại nhiều.

2

Nếu bạn luôn muốn tất cả những chiếc xe, bạn nên sử dụng find_all thay vì:

cars = Vehicle.find_all_by_num_wheels(4) 

Bạn cũng có thể biến một đơn Vehicle vào một mảng với:

cars = [cars] unless cars.respond_to?(:each) 
0

Bạn có thể làm điều này để get arrays everytimes:

cars = Vehicle.find(:all, :conditions => {num_wheels => 4}) 

Tôi không nghĩ rằng bạn có một vòng lặp sẽ kiểm tra xem đối tượng có phải là một mảng hay không.

Một giải pháp khác có thể là:

for i in (1..cars.lenght) 
    puts cars[i].inspect 
end 

(chưa được thử nghiệm, nó có thể phá vỡ để kiểm tra chiều dài trên một chuỗi Hãy cho tôi biết nếu có).

2

Đặt tên phiên bản scoped cho bạn vấn đề

Vehicle.scoped(:conditions => { :num_wheels => 4 }).each { |car| car.inspect } 
+0

Tôi nghĩ rằng đó sẽ là phạm vi ẩn danh, xem bạn không đặt tên nó như thế nào. Phạm vi là một câu trả lời tốt cho điều này, mặc dù. – Chuck

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