2017-05-09 15 views
1

在我的应用程序有模式Visits & Post &Ruby on Rails的 - 组帖子与和价格

class Visit < ActiveRecord::Base 
    belongs_to :post, :counter_cache => true 

class Post < ActiveRecord::Base 
    has_many :visits 

当访问者访问后,我就与post_idprice(添加到我的visitspricedecimal

在我的仪表板中,我想显示他们浏览过哪些帖子(已分组)以及他们赚了多少钱。

例如: 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及其帖子标题。

回答

0

答作品完美,只有我的问题是,我是从PostgreSql收到错误:

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... 

,我把它改成:

Visit.joins(:post).group([:post_id, :title]).select('sum(cpc_bid) as earnings', :post_id, :title, 'count(visits.id) as total_views').where(influencer: current_user) 

和它的工作。

注:我找不到不@ MikDiet的帮助和所有学分去他

1

你需要连接表和组

Post.joins(:visits).group(:id) 
    .where(visits: { user_id: current_user.id}) 
    .select("*, sum(price) as total_price, count(visits.id) as total_views") 

它增加了张贴实例访问器total_pricetotal_views。从@MikDiet

+0

感谢@MikDiet答案。它在我的'Development ENV'中工作,在那里我有'sqlite3'作为我的数据库。在'生产ENV'中,我使用'PostgreSql',并且出现这个错误:'PG :: GroupingError:ERROR:column“visits.id”必须出现在GROUP BY子句中或用于聚合函数中'&不应该'sum(visits.id)'是'count(visits.id)',因为'sum'会将所有的ID加在一起并且不计数? – Rubioli

+0

这会给我所有的帖子,我只想显示用户访问过的帖子,这就是为什么我有'where(user:current_user)''。我可以在哪里添加这个?先谢谢了! – Rubioli

+0

是的,我犯了一个错误,应该有'count(visits.id)' – MikDiet