在我的应用程序有模式Visits
& Post
&Ruby on Rails的 - 组帖子与和价格
class Visit < ActiveRecord::Base
belongs_to :post, :counter_cache => true
class Post < ActiveRecord::Base
has_many :visits
当访问者访问后,我就与post_id
和price
(添加到我的visits
表price
是decimal
)。
在我的仪表板中,我想显示他们浏览过哪些帖子(已分组)以及他们赚了多少钱。
例如: 1)支柱1,观察54次,并获得$ 1.6,2)柱2,观察39倍,并获得$ 1.1,等等
我与尝试:
- a = Visit.group(:post_id).where(user: current_user).sum(:price)
- a.each do |n|
%p
= n
这给我,每个post_id
,但price
只是*的BigDecimal:7fb2625f9238,“0.15E1 * &我不能做n.post.title
& n.post.title
找到文章标题给我的错误:undefined method 'post'
这是结果,我得到:
[44, #<BigDecimal:7fb2625f9238,'0.15E1',18(36)>]
[45, #<BigDecimal:7fb2625f8dd8,'0.13E1',18(36)>]
[46, #<BigDecimal:7fb2625f8928,'0.3E-1',9(36)>]
我也曾尝试用:
- Visit.select([:post_id, :price]).where(user: current_user).each do |e|
%p
= e.post.title
= e.cpc_bid
此选项可单独给我所有帖子和价格,而不是合并。
结果是这样的:
Post title 1, 0.15
Post title 1, 0.01
Post title 2, 0.1
Post title 1, 0.15
Post title 2, 0.1
Post title 2, 0.1
Post title 2, 0.1
Post title 1, 0.15
我也试过:
- Visit.select([:post_id, :price]).group(:post_id).where(user: current_user).each do |e|
%p
= e.post.title
= e.price
此选项让我只能在后,其价格的访问之一。
结果是:
Post title 2, 0.1
Post title 1, 0.15
我最后的尝试是:
- Visit.joins(:post).group(:post_id).select('sum(price) as earnings', :post_id, :title, 'count(visits.id) as total_views').where(user: current_user).each do |e|
%p
= e.title
= e.price
这给了我这个错误:
PG::GroupingError: ERROR: column "posts.title" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: ...ECT sum(price) as earnings, "visits"."post_id", "title", c...
我怎样才能结合起来他们的总和所有帖子均有price
及其帖子标题。
感谢@MikDiet答案。它在我的'Development ENV'中工作,在那里我有'sqlite3'作为我的数据库。在'生产ENV'中,我使用'PostgreSql',并且出现这个错误:'PG :: GroupingError:ERROR:column“visits.id”必须出现在GROUP BY子句中或用于聚合函数中'&不应该'sum(visits.id)'是'count(visits.id)',因为'sum'会将所有的ID加在一起并且不计数? – Rubioli
这会给我所有的帖子,我只想显示用户访问过的帖子,这就是为什么我有'where(user:current_user)''。我可以在哪里添加这个?先谢谢了! – Rubioli
是的,我犯了一个错误,应该有'count(visits.id)' – MikDiet