Rails:在时间范围内has_many

时间:2016-05-23 23:01:23

标签: ruby-on-rails activerecord

我有一个带有Comment模型的Rails应用程序和一个Notification模型,其中每个评论has_many :notifications

我想在此dependent: :destroy关系上设置has_many。问题是通知表是巨大的(某处大约有2000万条记录)。因此,每当我尝试销毁评论时,都会花几分钟时间查看通知表。

通常当我查询通知表时,我只是为created_at指定了一个范围,这看起来效果很好。

所有通知都是在评论created_at的24小时内创建的 - 所以我想加快关系,我可以添加类似

的内容
has_many :notifications, -> { where(created_at: created_at..(created_at + 1.day)) }, dependent: :destroy

但当然这不起作用,因为在created_at的实例上调用Notification::ActiveRecord_Relation,而不是原始评论。

是否有人在该评论的has_many查询中引用评论的属性?

2 个答案:

答案 0 :(得分:2)

在关联定义中,您可以引用注释作为块参数传递

has_many :notifications, 
            -> (comment) { where(created_at: comment.created_at..(comment.created_at + 1.day)) }, 
            dependent: :destroy

有关详细信息,请参阅文档的 Accessing the owner object 部分。

答案 1 :(得分:1)

使用joins引用where语句中的子类:

has_many :notifications, -> { joins(:notifications).where(notifications: { created_at: created_at..(created_at + 1.day) }, dependent: :destroy