2012-08-22 53 views
15

Tôi cần tìm nạp tất cả trạng thái current_user.friends và sau đó sắp xếp chúng theo created_at.Đường ray: so sánh Trạng thái với Trạng thái không thành công

class User < ActiveRecord::Base 
has_many :statuses 
end 

class Status < ActiveRecord::Base 
belongs_to :user 
end 

Và trong bộ điều khiển:

def index 
    @statuses = [] 
    current_user.friends.map{ |friend| friend.statuses.each { |status| @statuses << status } } 
    current_user.statuses.each { |status| @statuses << status } 

    @statuses.sort! { |a,b| b.created_at <=> a.created_at } 
end 

current_user.friends trả về một mảng các đối tượng User

friend.statuses trả về một mảng các đối tượng Status

Lỗi:

comparison of Status with Status failed 
app/controllers/welcome_controller.rb:10:in `sort!' 
app/controllers/welcome_controller.rb:10:in `index' 
+1

Không phải vấn đề cốt lõi của bạn nhưng đi bộ tất cả các liên kết đó sẽ giết bạn bởi số lượng truy vấn tuyệt đối. Nắm bắt tất cả bạn bè và tất cả các trạng thái của họ và sau đó sắp xếp chúng trong mã có thể mang lại một số truy vấn không đúng, hiệu suất của bạn sẽ giảm nhanh chóng. Tại sao không chỉ viết một truy vấn SQL đơn lẻ mà có thể lấy và sắp xếp tất cả các bản ghi đó cùng một lúc? –

+0

Cảm ơn bạn, tôi đã tìm thấy một cách dễ dàng và hiệu quả: 'Status.where (user_id: current_user.friends.map (&: id) .insert (0, current_user.id)). All' bạn nghĩ sao? Lỗi – Alex

Trả lời

16

Tôi gặp vấn đề tương tự, được giải quyết bằng phương pháp to_i, nhưng không thể giải thích tại sao điều đó xảy ra.

@statuses.sort! { |a,b| b.created_at.to_i <=> a.created_at.to_i } 

Bằng cách này, loại này theo thứ tự giảm dần. Nếu bạn muốn thứ tự tăng dần là:

@statuses.sort! { |a,b| a.created_at.to_i <=> b.created_at.to_i } 
+20

"so sánh X với X không thành công" được kích hoạt bởi 'nil' ở hai bên của' <=> '. Bằng cách thêm '.to_i' chuyển đổi bạn đã biến nils thành 0s và điều đó đã chữa khỏi. –

+0

đẹp! Trong trường hợp của tôi, không thể nào nhận được 'nil' trong phần này của mã .. có thể là lỗi của nó, tôi sẽ bắt đầu ghi nó. Cảm ơn! – hsgubert

+1

Serge - bạn nên đặt câu trả lời đó và câu trả lời phải được chấp nhận vì nó thực sự trả lời câu hỏi tiêu đề ... –

1

Tôi có một vấn đề tương tự tối nay về một dự án nhóm. Câu trả lời này không giải quyết được, nhưng vấn đề của chúng tôi là gì, ai đó đã đưa các mô hình khác vào. Ví dụ:

Class UsersController < ApplicationController 

def show 

    @status = @user.statuses.new 

end 

Điều này tạo ra xung đột giữa @ user.statuses và @status mà tôi đang cố gắng gọi trên trang. Tôi đã tắt người dùng và chỉ ...

def show 

    @status = Status.new 

end 

Và điều đó đã làm cho tôi.

4

Thông báo lỗi này xuất hiện khi sắp xếp được một số không được trả lại từ < =>. < => có thể trả về -1, 0, 1 hoặc nil, nhưng sắp xếp không thể xử lý nil vì nó cần tất cả các phần tử danh sách để có thể so sánh được.

class A 
    def <=>(other) 
    nil 
    end 
end 

[A.new, A.new].sort 
#in `sort': comparison of A with A failed (ArgumentError) 
# from in `<main>' 

Một cách để gỡ lỗi loại lỗi này bằng cách kiểm tra xem trả lại số < => có phải là không và nêu một ngoại lệ nếu có.

@statuses.sort! do |a,b| 
    sort_ordering = b.created_at <=> a.created_at 
    raise "a:#{a} b:#{b}" if sort_ordering.nil? 
    sort_ordering 
end 
Các vấn đề liên quan