2013-08-21 70 views
1
Tag.joins(:quote_tags).group('quote_tags.tag_id').order('count desc').select('count(tags.id) AS count, tags.id, tags.name') 

Build query: 
SELECT count(tags.id) AS count, tags.id, tags.name FROM `tags` INNER JOIN `quote_tags` ON `quote_tags`.`tag_id` = `tags`.`id` GROUP BY quote_tags.tag_id ORDER BY count desc 

結果:查詢,不能選擇列數

[#<Tag id: 401, name: "different">, ... , #<Tag id: 4, name: "family">] 

它不適合我回數列。我怎麼才能得到它?

+0

當你只選擇'count(tags.id)'時它是否工作? –

+0

是的,但是它只返回count列 –

回答

3

您是否嘗試過在返回的Tag對象之一上調用count方法?僅僅因爲inspect沒有提及count並不意味着它不存在。該inspect輸出:

[#<Tag id: 401, name: "different">, ... , #<Tag id: 4, name: "family">] 

將只包括事情的Tag類知道和Tag只知道在tags表中的列:你只有idname在表格中這就是你看到的。

如果你這樣做:

tags = Tag.joins(:quote_tags).group('quote_tags.tag_id').order('count desc').select('count(tags.id) AS count, tags.id, tags.name') 

,然後看看count S:

tags.map(&:count) 

你會看到計數的,你期待的陣列。

+0

它返回一個數組nil:[nil,nil,nil,...] 我想要的結果是tags.id,tags.name和count。 –

+0

您是否嘗試過撥打其他電話號碼以確保您不會與其他事件發生衝突? –

+0

不,就像我上面的查詢 –

1

更新:此答案的原始版本錯誤地表徵了select及後續版本,最終有效地重複了@muistooshort提供的其他答案的當前版本。我將它留在當前狀態,因爲它有關於使用原始sql的信息。感謝@ muistooshort指出我的錯誤。

儘管您的查詢實際上按照其他答案的解釋工作,但您始終可以執行原始SQL作爲替代方案。

有多種select_...方法可以選擇,但我認爲你會想要使用select_all。假設你隱式生成構建查詢是正確的,你可以使用,如:

ActiveRecord::Base.connection.select_all(' 
    SELECT count(tags.id) AS count, tags.id, tags.name FROM `tags` 
    INNER JOIN `quote_tags` ON `quote_tags`.`tag_id` = `tags`.`id` 
    GROUP BY quote_tags.tag_id 
    ORDER BY count desc') 

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html的信息,您可以選擇的各種方法。

+0

你確定嗎?我只是做了一個'Model.select('count(id)as count')。map(&:count)'並且重新計數。 –

+0

我不相信你調用的'count'方法對應於SQL中的count列。如果我使用'as foo'和'map(&:foo)',我得到一個'找不到方法'的錯誤,雖然它可以和count一起使用。 –

+0

是的,如果你做'User.select('count(id)as count')。method(:count)'你得到了'=>#<方法:ActiveRecord :: Relation(ActiveRecord :: Calculations)#count>' –