2010-04-23 8 views
5

मैं हेरोकू का उपयोग करने की कोशिश कर रहा हूं और स्पष्ट रूप से पोस्टग्रेस्क्ल कुल कार्यों के लिए एसक्यूएल से बहुत अधिक सख्त है। जब मैं हरोकू को दबा रहा हूं तो मुझे नीचे बताई गई त्रुटि मिल रही है।क्लॉज द्वारा समूह में टेबल कॉलम जोड़ना - रेल पर रूबी - पोस्टग्रेस्क्ल

On another question मैंने पूछा कि मुझे कुछ मार्गदर्शन प्राप्त हुआ है, जिसमें कहा गया है कि मुझे केवल अपने समूह में कॉलम जोड़ना चाहिए और मुझे यकीन नहीं है कि यह कैसे करें। नीचे दी गई पूर्ण त्रुटि और PostsControll # अनुक्रमणिका देखें।

SELECT posts.*, count(*) as vote_total FROM "posts" INNER JOIN "votes" ON votes.post_id = posts.id GROUP BY votes.post_id ORDER BY created_at DESC LIMIT 5 OFFSET 0): 

PostsController

def index 
    @tag_counts = Tag.count(:group => :tag_name, 
     :order => 'count_all DESC', :limit => 20) 
     conditions, joins = {}, :votes 

    @ugtag_counts = Ugtag.count(:group => :ugctag_name, 
     :order => 'count_all DESC', :limit => 20) 
     conditions, joins = {}, :votes 

    @vote_counts = Vote.count(:group => :post_title, 
      :order => 'count_all DESC', :limit => 20) 
      conditions, joins = {}, :votes 


     unless(params[:tag_name] || "").empty? 
     conditions = ["tags.tag_name = ? ", params[:tag_name]] 
     joins = [:tags, :votes] 
     end 
     @posts=Post.paginate(
       :select => "posts.*, count(*) as vote_total", 
       :joins => joins, 
       :conditions=> conditions, 
       :group => "votes.post_id", 
       :order => "created_at DESC", 
       :page => params[:page], :per_page => 5) 
     @popular_posts=Post.paginate(
       :select => "posts.*, count(*) as vote_total", 
       :joins => joins, 
       :conditions=> conditions, 
       :group => "votes.post_id", 
       :order => "vote_total DESC", 
       :page => params[:page], :per_page => 3) 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
     format.json { render :json => @posts } 
     format.atom 
    end 
    end 

उत्तर

3

MySQL और SQLite इतना लचीला है कि वे GROUP BY खंड (और COUNT() जैसे कुल फ़ंक्शन के अंदर) के बिना चयन सूची में कॉलम की अनुमति देते हैं। लेकिन लचीलापन का यह स्तर संदिग्ध प्रश्नों का कारण बन सकता है।

PostgreSQL केवल एएनएसआई एसक्यूएल मानक के रूप में सख्त है। मैंने परीक्षण किए गए सभी अन्य डेटाबेस (ओरेकल, माइक्रोसॉफ्ट, आईबीएम डीबी 2, फायरबर्ड) इस मुद्दे पर PostgreSQL की तरह व्यवहार करते हैं।

आपको अपनी चुनिंदा सूची में posts कॉलम की सूची बनाने की आवश्यकता है जो आपके GROUP BY खंड में नामित कॉलम से मेल खाता है। इसे कम कॉलम चुनकर या :group पर कॉलम जोड़कर करें।

मैं रेल विशेषज्ञ नहीं हूं, और मुझे :group पर तर्क के रूप में एकाधिक कॉलम को पारित करने का उदाहरण नहीं मिल रहा है। Active_record/base.rb के लिए कोड को देखते हुए, ऐसा प्रतीत होता है कि यह केवल विकल्प मान को एक शाब्दिक SQL GROUP BY खंड में कॉपी करता है। इसलिए मैं (इसे करने की कोशिश बिना) आप यह कर सकते हैं कि लगता है कि होगा:

... 
:group => "posts.post_id, posts.foo, posts.bar, posts.baz", 
... 

नोट आप नाम के लिए हर कॉलम आपके चयन-सूची है कि एक समग्र समारोह का हिस्सा नहीं है में है कि है।

group_models = [Post, Vote, etc.] 
group_columns = ['"votes"."post_id"'] # whatever column you were specifying with :group 
group_models.each do |model| 
    group_columns += model.column_names.map { |col| "\"#{model.table_name}\".\"#{col.name}\"" } 
end 
Post.where(whatever...).group(group_columns) 
+0

उसने ऐसा किया। आपका बहुत बहुत धन्यवाद। एक अलग प्रश्न के रूप में अगले मुद्दे को पोस्ट करने के बारे में। – bgadoci

+0

मैंने समूहबद्ध समूह को सूचीबद्ध करने के लिए हमेशा एक सरल स्ट्रिंग का उपयोग किया है। –

1

तुम सिर्फ posts.id जैसे का उपयोग कर का उपयोग करने जा प्रयास किया है:

SELECT posts.*, count(*) as vote_total FROM "posts" INNER JOIN "votes" ON votes.post_id = posts.id GROUP BY posts.id ORDER BY created_at DESC LIMIT 5 OFFSET 0); 

यदि हां, तो कैसे परिणाम तो सेट तुम क्या हो रही है से भिन्न क्यों है आपके मौजूदा एसक्यूएल के साथ?

+0

मैंने आईडी पोस्ट करने के लिए केवल समूह => "वोट.post_id" को बदलने की कोशिश की लेकिन उस समूह पर क्लिक करते समय और URL w/tag_name भेजते समय, यह टूट जाता है। यहां त्रुटि है: SQLite3 :: SQLException: संदिग्ध कॉलम नाम: post_id: चयन करें। *, गिनती (*) को "पोस्ट" से वोट_टॉटल के रूप में गिनें "टैग" टैग्स पर पोस्ट करें। पोस्ट_आईडी = पोस्ट.आईडी इनर जॉइन "वोट" वोट.post_id = posts.id कहां (टैग.tag_name = 'सबसे हालिया टैग') बनाया गया है द्वारा पोस्ट_आईडी ऑर्डर द्वारा बनाया गया डीईएससी लिमिटेड 5 ऑफसेट 0 – bgadoci

+0

आह - ठीक है कि त्रुटि आपको बता रही है कि यह नहीं बता सकता कि आप समूहबद्ध हैं या नहीं वोट.post_id या tag.post_id तो - आपको इसे बताना होगा :) –

+0

यह अभी भी PostgreSQL में काम नहीं करेगा। PostgreSQL 9.1 में काम करेगा यदि post.id प्राथमिक कुंजी है। –

0

मैं सिर्फ ऑन रेल्स 3. इस मुद्दे से निपटने के यहाँ समाधान मैं के साथ आया है

model_columns = Model.column_names.collect do |c| "#{Model.table_name}.#{c}" end.join(",")

1

मैं एक बदलाव जो बनाने तालिका नाम संकलन समय पर fiends में शामिल होने के गतिशील बजाय शामिल है के साथ आया था:

संबंधित मुद्दे