Неоднозначная ссылка на таблицу

Эта проблема кажется довольно простой, но я никогда не сталкивался с такой.

Вот настройки:

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

Как это устроено:

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

Другие вопросы по тегам