2013-08-05 37 views
0

我有困難得到一個範圍與PG數據庫中的Rails應用程序的工作。在groups_controller.rb的顯示頁面中,我試圖顯示由created_at排序的兩種不同類型的數據。第一個是誰加入該組的用戶和第二,誰確認出席任何該組的事件,其結果可能會像這樣連接多個模型來創建活動飼料

user joined group (7 minutes ago) 
user confirmed attendance (10 minutes ago) 
user joined group (15 minutes ago) 

混合在一起,用戶的模型如下

Group.rb

has_many :memberships 
has_many :users, through: :memberships 

has_many :events 

User.rb

has_many :memberships 
has_many :groups, through: :memberships 

has_many :confirmations 
has_many :events, through: :confirmations 

Event.r b

has_many :confirmations 
has_many :users, through: :confirmations 

在groups_controller.rb的表演動作,我創造了這樣的recent_activities動作,傳遞Time.now並打算用它來獲取所有在過去24小時內的結果

def show 
@recent = Group.recent_activities(Time.now) 

end 

然而,當它來到group.rb編寫方法,我遇到了問題。例如,使用這種格式

where(memberships: {created_at: ''} 

我不知道如何在過去24小時內計算,或在過去的7天。我確信還有其他問題,我如何嘗試這樣做。有小費嗎?我只寫了幾個,這些類型的查詢的在我的生活,使他們已經走出來的所有mishapen

Group.rb 

scope :recent_activities, lambda {|time| 
    joins(:user, :membership, :confirmation, :event). 
    where(memberships: {created_at: ''}, 
      confirmations: {created_at: '' }) 

    } 

回答

1

試試這個:

scope :recent_activities, lambda{ |time| 
    joins({:memberships => :users}, {:events => :confirmations}). 
    where('CAST(memberships.created_at as DATE) > :yesterday 
     AND CAST(confirmations.created_at as DATE) > :yesterday', 
     yesterday: Date.today - 1.days) 

} 

(你可以在添加下面的關係集團模型:)

has_many :events 
has_many :confirmations, :through => :events 
+0

感謝,但它不工作。你能寫出整個方法嗎?注意確認和組之間沒有關聯對您的解決方案來說很重要。 '組has_many:事件,事件has_many:確認'或者這沒關係? – Leahcim

+0

我剛剛上傳了我的答案。這是一個非常複雜的查詢,用複雜的關係來實現! @Leahcim – MrYoshiji

1

添加這個答案只是爲了顯示你可以使用agosince方法。

所以,你可以對做這樣的事情「因爲在過去的24小時」的time參數。

scope :recent_activities, lambda {|time| 
    joins(:user, :membership, :confirmation, :event). 
    where("memberships.created_at >= :twenty_four_hours_ago and confirmations.created_at >= :twenty_four_hours_ago", twenty_four_hours_ago: 24.hours.ago(time)) 
} 
+0

我得到這個錯誤:'協會命名爲「確認」的集團沒有被發現;也許你拼錯了?「羣體和確認之間沒有直接的關係。有沒有辦法修改你的答案來解決這個問題?由於 – Leahcim

+0

@Leahcim,看來,你已經找到了解決辦法。正如Yoshiji先生指出的那樣,您需要通過以下方式定義'has_many:確認::events'。 – vee

0

當你要創建一個飼料的活動,看看this寶石,它可以幫助你。
你可以看到這個railscasts