2010-06-28 52 views
11

我正盡我所能地圍繞着arel和它背後的關係代數彎曲我的大腦,但如何表示SELECT DISTINCT始終無法理解我的理解。任何人都可以解釋如何arel:如何使用arel /關係代數獲取不同的值

SELECT DISTINCT title FROM posts; 

非常感謝!

+1

我不知道AREL但是從我讀「深度數據庫」由CJDate,在關係代數查詢的結果是一組元組。所以如果arel遵循這個理論而不是獨特的應該是默認的。 – 2010-06-28 21:42:01

回答

1

Post.select('DISTINCT title')

更新1:

在後的時間,這是不具備的阿雷爾。這些天來,ActiveRecord的:: QueryMethods有uniq方法(http://apidock.com/rails/ActiveRecord/QueryMethods/uniq),所以你會希望:

Post.select(:title).uniq 

更新2: 貌似阿雷爾現在支持這種行爲。 @maerics有正確的答案。如果這不是我們接受的答案,我會刪除它。

+0

不完全代數,但很難與它的效率爭論;-) – jemmons 2010-07-06 22:32:34

+2

這種方法存在一個致命的問題:如果您有多個範圍使用select語句,將它們鏈接在一起可能會導致無效的SQL。 – 2011-04-25 21:55:28

+5

這不是AREL,因此它不回答問題。 – 2011-09-30 15:19:15

6

上一個答案是Rails方式,不是嗎?不是Arel的方式。

這適用於的1.x:

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

我猜還有另一個「更正確」的方式通過API來做到這一點,但我還沒有想通了這一點呢。

+4

這似乎現在不起作用。 – 2011-11-08 18:12:10

+1

這是真的。這個答案適用於Arel 1.x,並且不再有效。 – numbers1311407 2011-11-09 03:44:16

+1

你知道另一個選擇嗎? – 2011-11-09 10:53:18

3

如果你正在做這個使用範圍:

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

由於AREL總是使用SET在它的操作中,重複行的結果將被自動刪除。只需使用普通的項目(Phi)操作即可。

+0

理論上這是個不錯的主意,但在現實中顯然是虛假的。 Arel查詢將從任何投影中返回重複條目,除非顯式限制爲「distinct」方法。 – maerics 2012-09-19 04:50:38

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"' 

奇怪的是,「不同的」方法沒有環連接,每另一阿雷爾方法。

+0

我一直在尋找這個一段時間,非常感謝! – Joe 2012-11-02 20:49:10

+0

隨着Arel版本,'5.0.1',這不再工作:(。 – 2015-01-19 18:47:50

+1

Arel 6,一切正常完美。它也是可鏈接的,因爲它返回SelectManager。 – Slotos 2015-05-29 11:24:05

8

的阿雷爾方式做到這一點是:

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

'count(true)'對於Arel 3 – 2014-10-15 23:08:38