2017-05-09 45 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