Tôi muốn hiển thị một bộ sưu tập gồm products
nơi tôi bao gồm các sản phẩm vừa được bán và không bán. Chỉ có tôi muốn products
được bán để xuất hiện ở mặt trước của danh sách và các đối tượng không được bán sẽ xuất hiện ở cuối danh sách.Có thể sắp xếp danh sách các đối tượng tùy thuộc vào phản ứng của đối tượng riêng lẻ đối với một phương thức không?
Một cách dễ dàng cho tôi để thực hiện điều này là làm cho hai danh sách, sau đó kết hợp chúng (một danh sách các đối tượng on_sale và một danh sách không on_sale đối tượng?):
available_products = []
sold_products = []
@products.each do |product|
if product.on_sale?
available_products << product
else
sold_products << product
end
end
. . . Nhưng làm với cấu trúc của ứng dụng hiện có của tôi, điều này sẽ đòi hỏi một số tiền quá nhiều của tái cấu trúc do một sự kỳ quặc trong mã của tôi (tôi mất phân trang của tôi, và tôi không muốn refactor). Sẽ dễ dàng hơn nếu có cách sắp xếp danh sách đối tượng hiện có theo phương pháp của mô hình on_sale?
trả về giá trị boolean.
Có thể lặp lại thanh lịch hơn thông qua danh sách hiện tại và sắp xếp nó theo giá trị đúng hay sai này trong đường ray không? Tôi chỉ hỏi vì có quá nhiều thứ mà tôi không biết về ẩn trong khuôn khổ/ngôn ngữ này (ruby) và tôi muốn biết liệu chúng có hoạt động được thực hiện trước tôi hay không.
Trông tuyệt vời! Nhưng tôi gặp vấn đề với nó với mã cụ thể của tôi, có lẽ bạn có thể giúp tôi với nó. Nếu tôi sử dụng một lớp lót tôi nhận được lỗi sau 'so sánh FalseClass với đúng thất bại', và nếu tôi sử dụng mã đầu tiên bạn đã đề cập, tôi nhận được' so sánh của [MyModule] :: Sản phẩm với [MyModule] :: Sản phẩm thất bại '. Không chắc chắn tại sao điều này sẽ thất bại. – Ecnalyr
Một số lưu ý: 1) Một nên luôn luôn sử dụng 'sort_by' trên' sort' bất cứ khi nào có thể (nhiều khai báo, ngắn gọn hơn, hiệu quả hơn). Có thể sử dụng nó trong tất cả các đoạn được hiển thị ở trên. 2) Nó có thể tôi thích hợp hơn để liên kết với không phá hủy 'Enumerable # sort_by', cập nhật tại chỗ nên tránh bất cứ khi nào có thể. 3) '@ product.sort_by (&: on_sale?)'. – tokland
Có vẻ như '<=> 'không hoạt động đúng với các boolean (trong ruby-1.9.3-p327). Nhìn vào nó ngay bây giờ ... Yeah, http://grosser.it/2010/07/30/ruby-true-false-comparison-with/ xác nhận nó cho một phiên bản trước đó – AlexChaffee