不明确的表引用(Ambiguous table reference)

2019-11-02 00:19发布

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

具体设置如下:

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_link的。 这是因为类读者的实际上是用户。 如何查询谁是由reader_links创建44分钟前的读者?

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

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

Answer 1:

如果我得到它的权利,你只需要指定created_at你在谈论列:

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


Answer 2:

你不需经过合并范围摆脱ambigious错误的,所以每个范围都有它自己的可视范围。

使用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含reader_links和读者的数据超过45分钟年轻所有的读者对象。 请尝试在铁轨控制台。

编辑:对于单篇文章

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



文章来源: Ambiguous table reference