Неоднозначная ссылка на таблицу
Эта проблема кажется довольно простой, но я никогда не сталкивался с такой.
Вот настройки:
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 45 минут назад?
Я ищу что-то вроде..
@post.readers.where('reader_link.created_at >= ?', 45.minutes.ago)
2 ответа
Если я правильно понял, вам просто нужно указать, какие 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))
Это приведет к массивам 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))
Как это устроено: