Ruby循环将事物添加到一起

时间:2014-02-18 18:10:34

标签: mysql ruby-on-rails ruby

假设我有以下表数据

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数据库,所以如何在rails应用程序的ruby中运行类似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-many)的模型,即用户表

我的article.rb文件中只包含belongs_to :user,而user.rb包含has_many :articles

编辑2:

我在我的article.rb文件中创建了一个命名范围:sum with lambda {find_by_sql(“Select ....”)}

现在的问题是如何为WHERE user_id = ?添加通配符,以便我只为正确的用户抓取文章?现在我的user_controller中包含@articles = Articles.sum参数。

2 个答案:

答案 0 :(得分:1)

您始终可以使用以下命令执行任何sql查询:

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

然而,这并不理想,因为它不是db不可知的。通常情况下,模型可以很好地处理这样的查询,但是查询结构取决于模型的定义方式,所以在与我们分享之前不再需要帮助。

更新:

经过一番讨论后,似乎最好的方法是重新设计你的模型。 不要使用具有不同view_counts的文章的多个副本,而是创建具有id,article_id和views_count的DailyViews模型。通过has_many关联将其与文章模型相关联。然后你可以简单地打电话:

article.daily_views.sum(:views_count)

计算给定文章的所有观点。我可能会将上面的内容包装到另一个方法total_views中。您还可以在新模型上定义范围,这样可以更轻松地计算给定月份或年份的查看次数。

答案 1 :(得分:0)

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

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

它会给你像''1'=&gt;的结果'11','2'=&gt; '7'}