2014-02-18 26 views
0

比方說,我有以下表中的數據紅寶石環路添加的東西放在一起

id count 
1 5 
1 6 
2 7 

,我想在結尾處用一個數組{[1,11] [2,7]}。我如何最有效地做到這一點?

到目前爲止,我有這樣的:

IDs = Array.new 
table.each do |t| 
    if !IDs.include? t.id 
     IDs << t.id 
    end 
end 

,然後我在想沿IDs.each do |i|線去,並將它添加到一個臨時變量...然後最終返回一個二維數組。

有沒有更簡單的方法?這一切都來自一個MySQL數據庫,所以我怎麼能在軌道應用程序的紅寶石運行像SELECT id, sum(count) FROM table GROUP BY id

編輯:

下面是創建在文章表遷移

class CreateArticles < ActiveRecord::Migration 
def change 
    create_table :articles do |t| 
    t.integer "nid" 
    t.string "title" 
    t.string "section" 
    t.integer "views" 
    t.date "date" 
    t.integer "user_id" 
    end 
end 
end 

的NID整數是一個我想基於聚合它(即查詢是SELECT nid, title, section, sum(views), date FROM users WHERE user_id=?然後我需要一個在這樣的模式,通過文章屬於(1-多),這是用戶表。

我article.rb文件只有在它belongs_to :user和user.rb具有has_many :articles

編輯2:

我在叫article.rb文件進行了命名範圍:總和與拉姆達{的find_by_sql(「選擇......」)}

現在的問題是我怎麼放那裏的通配符爲WHERE user_id = ?,以便我只爲正確的用戶抓取文章?現在我的user_controller中有@articles = Articles.sum參數。

+0

是的,你可以...它更簡單,如果你運行你自己提出的查詢 – Hackerman

+0

我該怎麼做?在model.rb文件中命名範圍? – Killerpixler

+0

該表是否與某個模型關聯?你的模型結構是什麼? – BroiSatse

回答

1

可以使用始終執行任何SQL查詢:

ActiveRecord::Base.connection.execute('SELECT id, sum(count) FROM table GROUP BY id').values 

然而,這是不理想的,因爲它不DB無關。通常這樣的查詢通過模型處理得非常好,但是查詢結構取決於您的模型是如何定義的,所以在與我們分享這些模型之前不需要任何幫助。

UPDATE:

一些討論,好像走的是重新設計車型的最佳方法之後。 而不是有不同的view_counts文章的多個重複,創建DailyViews模型conaining id,article_id和views_count。通過has_many關聯將其與Article模型相關聯。然後,你可以簡單地調用:

article.daily_views.sum(:views_count) 

指望定項目各方面的意見。我可能會將上述內容換成另一種方法total_views。您還可以在新模型上定義範圍,因此,您可以更輕鬆地計算給定月份或年份的查看次數。

0
a = Article.select('nid, sum(views) as count').group('nid') 

a.inject({})do |res, i | 
    res[i.status] = i.total 
    res 
    end 

它會給你造成像{ '1'=> '11', '2'=> '7'}

+0

我會在那裏放?進入模型? – Killerpixler

+0

沒有必要,你可以把它放在關注的位置,在你想要計算的任何地方建模。 –