不明确的表格参考

时间:2013-04-06 02:54:18

标签: ruby-on-rails activerecord model activerecord-relation

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

以下是设置:

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)

2 个答案:

答案 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))

工作原理:

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

答案 1 :(得分:1)

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

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