![](/img/trans.png)
[英]#<ActiveRecord::Associations::CollectionProxy []> in Rails
[英]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.