繁体   English   中英

Rails循环通过ActiveRecord :: Associations:CollectionProxy

[英]Rails loop through ActiveRecord::Associations:CollectionProxy

我有一个ActiveRecord::Associations:CollectionProxy的格式

#<DailyViewMetric article_id: xxxxxx, date: xxxxxxx, views: xxxxxx, visitors xxxxx,.....>在名为metrics的变量中。

article_id是一个外键,并在表中重复(因为一篇文章可以连续几天获得指标(即今天有15次观看,而后一天有20次观看)。

我需要一种方法来遍历此过程,并对这些指标中的某些指标应用不同的操作,例如获取每篇文章的最小日期,总观看次数(= sum(views))。 我试过metrics.map do |a| metrics.collect但总是会出现红宝石错误, undefined method 'views'例如,让我们metrics.collect下面的简化数据集

article_id date         views
1          2014-01-01   10
2          2014-01-01   15
1          2014-01-02   20
2          2014-01-02   12
3          2014-01-02   6

之后应导致以下新数组:

article_id date         views
1          2014-01-01   30
2          2014-01-01   27
3          2014-01-02   6

如您所见,views变量保存了相应文章的视图总和,date变量是日期中的最小值。 如何正确执行此操作? 我也尝试了metrics.to_a但仍然出现此错误。

编辑

我尝试了DailyViewMetric.find_by_sql("SELECT article_id, sum(views) from daily_view_metrics where article_id in(SELECT id from articles where user_id=xxx) GROUP BY article_id")

如果我在mysql控制台中执行查询,则可以正常工作,并从上方返回第二个表。 但是当我在Rails控制台中运行它时,它给了我

[#<DailyViewMetric id: nil, article_id: 1089536>, #<DailyViewMetric id: nil, article_id: 1128849>, #<DailyViewMetric id: nil, article_id: 1141623>,

您可以在SQL / ActiveRecord中完全完成此操作。 您最终要运行的查询是

SELECT article_id, min(date), sum(views)
FROM   daily_value_metrics -- Or whatever your table is called
GROUP BY article_id

您可以使用ActiveRecord运行以下命令:

table = DailyValueMetric.arel_table
results = DailyValueMetric.select(table[:article_id], 
  table[:date].minimum.as('date'), 
  table[:views].sum.as('views')).group(:article_id).to_a
# Calling to_a so I can call first for the example
results.first.date #=> date
results.first.views #=> views
results.first.article_id #=> Id

记录看起来像

[#<DailyViewMetric id: nil, article_id: 1089536>, ...]

因为SQL查询不会在结果集中返回id列。 这是因为ActiveRecord::Base#inspect显示表中定义的列的方式,而不是表列之外的返回值。 除非有相同名称的列,否则不一定会显示Views和Date,但是如果您在模型实例上调用这些属性,则可以获取该值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM