2012-08-22 10 views
15

मैं सभी current_user.friends स्थितियों लाने और फिर created_at द्वारा उन्हें सुलझाने के लिए की जरूरत है।रेल: स्थिति के साथ स्थिति की तुलना में विफल रहा है

class User < ActiveRecord::Base 
has_many :statuses 
end 

class Status < ActiveRecord::Base 
belongs_to :user 
end 

और नियंत्रक में:

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 ऑब्जेक्ट की श्रृंखला User

friend.statuses ऑब्जेक्ट की श्रृंखला रिटर्न देता है Status

त्रुटि:

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

आपकी मूल समस्या नहीं है लेकिन उन सभी संगठनों को चलने से आपको प्रश्नों की संख्या बहुत अधिक होगी। सभी दोस्तों और उनकी सभी स्थितियों को पकड़कर और फिर उन्हें कोड में सॉर्ट करने से असंगत संख्या में प्रश्न मिल सकते हैं, आपका प्रदर्शन तेजी से गिरने वाला है। क्यों न सिर्फ एक ही SQL क्वेरी लिखें जो उन सभी रिकॉर्ड्स को एक साथ ला सकता है और सॉर्ट कर सकता है? –

+0

धन्यवाद, मुझे एक आसान तरीका और प्रभावी तरीका मिला: 'Status.where (user_id: current_user.friends.map (&: id) .insert (0, current_user.id))। सभी 'आपको क्या लगता है? – Alex

उत्तर

16

मैं एक ऐसी ही समस्या है, to_i विधि के साथ हल किया था, लेकिन व्याख्या नहीं कर सकते क्यों ऐसा होता है।

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

वैसे, इस तरह के अवरोही क्रम में। यदि आप आरोही क्रम चाहते हैं:

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

"एक्स के साथ एक्स की तुलना विफल रहा" त्रुटि 'nil' द्वारा' '<=> के दोनों तरफ शुरू हो रहा है। '.to_i' रूपांतरण जोड़कर आपने नाइल्स को 0 में बदल दिया है और इससे बात ठीक हुई है। –

+0

अच्छा! मेरे मामले में कोड के इस हिस्से में 'शून्य' प्राप्त करना असंभव होना चाहिए .. शायद यह एक बग है, मैं इसे लॉग करना शुरू कर दूंगा। धन्यवाद! – hsgubert

+1

सर्ज - आप एक जवाब के रूप कि रखना चाहिए, और यह, स्वीकार किया जाना चाहिए के रूप में यह वास्तव में शीर्षक सवाल का जवाब ... –

1

मुझे समूह परियोजना पर आज रात भी इसी तरह की समस्या थी। इस जवाब ने इसे हल नहीं किया, लेकिन हमारी समस्या क्या थी, किसी ने हमारे डीफ शो उपयोगकर्ता नियंत्रक में अन्य मॉडलों को रखा। नया। उदाहरण के लिए ...

Class UsersController < ApplicationController 

def show 

    @status = @user.statuses.new 

end 

यह @ user.statuses और @status मैं पृष्ठ पर कॉल करने के लिए कोशिश कर रहा था के बीच एक संघर्ष बनाने गया था। मैंने उपयोगकर्ता को हटा दिया और बस किया ...

def show 

    @status = Status.new 

end 

और यह मेरे लिए चाल है।

4

यह त्रुटि संदेश प्रकट होता है जब तरह एक शून्य < => से लौटे हो जाता है। < => -1, 0, 1, या नहीं के बराबर लौट सकते हैं, लेकिन तरह शून्य संभाल सकते हैं क्योंकि यह सब सूची तत्वों की जरूरत है तुलनीय किया जाना है।

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

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

एक तरीका यह त्रुटि के इस प्रकार डिबग करने के लिए जाँच के द्वारा होता है, जब < शून्य => है की वापसी और एक अपवाद को ऊपर उठाने अगर यह होता है।

@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 
संबंधित मुद्दे