假设我有以下表数据
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
参数。
答案 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'}