2010-06-28 7 views
11

मैं अपने दिमाग को चारों ओर अपने दिमाग को झुकाव और इसके पीछे संबंधपरक बीजगणित को झुकाव करने के लिए अपना सर्वश्रेष्ठ प्रयास कर रहा हूं, लेकिन SELECT DISTINCT का प्रतिनिधित्व करने के लिए मेरी समझ लगातार बढ़ रही है। क्या कोई बता सकता है कि कैसे करें:एआरएल/रिलेशनल बीजगणित के साथ अलग-अलग मान कैसे प्राप्त करें

SELECT DISTINCT title FROM posts; 

बहुत धन्यवाद!

+1

मैं अरेल पता नहीं है लेकिन "गहराई में डाटाबेस" के अपने पढ़ने CJDate द्वारा से, संबंधपरक बीजगणित में एक प्रश्न के परिणाम का एक सेट है tuples। तो यदि इस सिद्धांत का पालन अलग-अलग से अलग है तो डिफ़ॉल्ट होना चाहिए। –

उत्तर

1

Post.select('DISTINCT title')

अद्यतन 1:

पोस्ट के समय, इस अरेल में उपलब्ध नहीं था। इन दिनों, ActiveRecord :: QueryMethods uniq विधि (http://apidock.com/rails/ActiveRecord/QueryMethods/uniq) है, तो आप चाहते हैं चाहते हैं:

Post.select(:title).uniq 

अद्यतन 2: लगता अरेल अब इस व्यवहार का समर्थन करता है की तरह। @ मामेरिक्स का सही जवाब है। अगर यह स्वीकार्य उत्तर नहीं था तो मैं इसे हटा दूंगा।

+0

बिल्कुल बीजगणितीय नहीं है, लेकिन इसकी दक्षता के साथ बहस करना मुश्किल है ;-) – jemmons

+2

इस दृष्टिकोण के साथ एक घातक समस्या है: यदि आपके पास एक चुनिंदा कथन के साथ एक से अधिक गुंजाइश हैं, तो उन्हें एक साथ जोड़कर अमान्य एसक्यूएल हो सकता है। –

+5

यह एआरईएल नहीं है, और इस प्रकार यह सवाल का जवाब नहीं देता है। –

6

पिछला उत्तर रेल मार्ग है, नहीं? एरियल रास्ता नहीं।

यह 1.x के लिए काम करता है:

posts = Table(:posts) 
posts.project(Arel::Distinct.new(posts[:title])) 

मैं वहाँ एक और "अधिक सही" जिस तरह से एपीआई के माध्यम से ऐसा करने के लिए है, लेकिन मैं अभी तक पता लगा नहीं किया है कि लगता है कि होगा।

+4

यह अब काम नहीं कर रहा है। –

+1

यह सच है। यह जवाब एरेल 1.x के लिए था और अब काम नहीं करेगा। – numbers1311407

+1

क्या आप जानते हैं कि विकल्प क्या है? –

3

आप एक दायरे का उपयोग करके यह कर रहे हैं, तो:

scope :recent, lambda {|count| 
    select("DISTINCT posts.*"). 
    joins(:whatever). 
    limit(count). 
    order("posts.updated_at DESC") 
    } 
0

के बाद से AREL हमेशा के अनुसार उसका आपरेशन है का उपयोग करता है, डुप्लिकेट पंक्ति परिणाम स्वचालित रूप से हटा दिया जाएगा। बस एक सामान्य परियोजना (फाई) ऑपरेशन का उपयोग करें।

+0

यह सिद्धांत में एक अच्छा विचार है लेकिन यह वास्तव में वास्तविकता में झूठा है। एरल प्रश्न स्पष्ट रूप से "विशिष्ट" विधि से बाधित होने तक किसी भी प्रक्षेपण से डुप्लिकेट प्रविष्टियां वापस कर देंगे। – maerics

12

शुद्ध अरेल (रेल/ActiveRecord नहीं) का उपयोग करना एक "अलग" विधि:

Arel::VERSION # => '3.0.2' 
posts = Arel::Table.new(:posts) 
posts.project(posts[:title]) 
posts.distinct 
posts.to_sql # => 'SELECT DISTINCT "posts"."title" FROM "posts"' 

मजे की बात है, "अलग" विधि chainable नहीं है, प्रति अन्य अरेल तरीकों।

+0

मैं इसे कुछ समय के लिए देख रहा हूं, बहुत धन्यवाद! – Joe

+0

एरल संस्करण, '5.0.1' के साथ, यह अब काम नहीं करता है :( –

+1

एरल 6, सब कुछ पूरी तरह से काम करता है। यह भी श्रृंखलाबद्ध है, क्योंकि यह SelectManager लौटा रहा है। – Slotos

8

अरेल तरह से यह करने के लिए है:

t = Arel::Table.new(:foo) 
count_distinct = t[:field].count(true) 
count_distinct.to_sql # => "COUNT(DISTINCT `foo`.`field`)" 
+0

' गिनती (सत्य) 'का उपयोग किया है, एरियल 3 के लिए बहुत अच्छा काम करता है –

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