这个问题看起来相当简单,但我从未遇到过这样的问题。
以下是设置:
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)
答案 0 :(得分: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))
这将导致包含reader_links和读者数据的Post
个对象数组,所有读者都不到45分钟。请在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))
工作原理:
答案 1 :(得分:1)
如果我做对了,您只需要指定您正在谈论的created_at
列:
@post.readers.where('reader_links.created_at >= ?', 45.minutes.ago).any?