不明确的表格参考

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

以下是设置:

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

我需要找出是否有读者阅读post。

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

效果很好。

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

抛出一个模糊的表列错误,因为create_at列是读取器对象还是reader_link对象是混淆的。 这是因为读者的类实际上是用户。 如何查询45分钟前由reader_links创建的读者?

我正在寻找像…

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

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

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

您可以合并范围以消除暧昧错误,因此每个范围都有自己的可见范围。

使用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

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

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

 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