0

这个问题看起来很简单,但我从来没有遇到过这样的问题。

以下是设置:

Post has_many :reader_links
Post has_many :readers, :through => :reader_links

我需要了解是否有读者阅读帖子。

@post.reader_links.where('created_at >= ?', 45.minutes.ago).any?

效果很好。

@post.readers.where('created_at >= ?', 45.minutes.ago),any?

抛出一个模棱两可的表列错误,因为混淆了该created_at列是指reader对象还是reader_link对象。发生这种情况是因为阅读器的类实际上是用户。如何查询45 分钟前由 reader_links 创建的读者?

我正在寻找类似的东西..

@post.readers.where('reader_link.created_at >= ?', 45.minutes.ago)

4

2 回答 2

1

您可以合并范围以消除模棱两可的错误,因此每个范围都有自己的可见性范围。

使用meta_where

Post.scoped & (ReaderLink.scoped & User.where(:created_at.gt => 45.minutes.ago))

没有meta_where

Post.scoped.merge(ReaderLink.scoped.merge(User.where('created_at >= ?', 45.minutes.ago))

这将导致Post包含所有年龄小于 45 分钟的读者的 reader_links 和读者数据的对象数组。请在 Rails 控制台中尝试。

编辑:对于单个帖子

post_with_fresh_users = Post.where('id = ?', some_id).merge(ReaderLink.scoped.merge(User.where('created_at >= ?', 45.minutes.ago))

编辑:帖子的所有新读者(不同顺序)

fresh_readers_for_post = User.where('created_at >= ?', 45.minutes.ago).merge(ReaderLink.scoped.merge(Post.where('id = ?', @post.id))

这个怎么运作:

http://benhoskin.gs/2012/07/04/arel-merge-a-hidden-gem

于 2013-04-06T03:24:14.157 回答
1

如果我猜对了,您只需要指定created_at您正在谈论的列:

@post.readers.where('reader_links.created_at >= ?', 45.minutes.ago).any?
于 2013-04-06T13:51:11.377 回答