加入多个模型以创建活动供稿

时间:2013-08-05 19:21:45

标签: ruby-on-rails postgresql

我很难在使用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.rb

 has_many :confirmations
 has_many :users, through: :confirmations

在groups_controller.rb的show动作中,我创建了一个这样的recent_activities动作,传递Time.now,目的是使用它来获取过去24小时的所有结果

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

end 

然而,当在group.rb中编写方法时,我遇到了问题。例如,使用此格式

where( memberships: {created_at: ''}

我不知道如何在过去24小时内或过去7天内计算出来。我确定我正在尝试这样做还有其他问题。有小费吗?在我的生活中,我只写了一些这类查询,所以他们全都出错了

Group.rb

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

  }

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

添加此答案只是为了表明您可以使用agosince方法。

所以你可以为time参数的“自过去24小时后”做这样的事情。

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))
}

答案 2 :(得分:0)

当您尝试创建Feed活动时,请查看this gem,它可能对您有帮助。
你也可以看到这个railscasts