rails - эффективно выбирает один объект с идентификатором, не входящим в известный набор - PullRequest
2 голосов
/ 31 июля 2010

Я создаю групповой блог, который модерируется сообществом. Когда пользователь заходит на страницу moderate, он получает случайное сообщение, которое он еще не модерировал, и спрашивает, должно ли это сообщение появиться.

Итак, соответствующие объекты: Post, User и Moderation. A Moderation имеет post_id и user_id. Я хочу найти сообщение из набора Post.all, где не существует объекта Moderation, соответствующего этому сообщению и текущему пользователю.

Какой самый эффективный способ сделать это? Я мог бы получить все модерации для этого пользователя, а затем использовать map, чтобы получить все сообщения, которые модерировал пользователь, а затем запросить базу данных сообщений как (псевдокод) Post.find(:conditions => "id != [list of posts already moderated]), но я ' Я обеспокоен тем, что может быть медленным? Есть ли более быстрый способ?

Кроме того, было бы неплохо как-то кешировать это? Может быть, получая все сообщения, которые не были модерированы, и сохраняя их где-то, а затем, когда будут сделаны будущие вызовы метода moderate, сначала проверьте этот кеш и обработайте сообщение (и удалите это сообщение из кеша), и только проверять еще раз сообщения, если кеш пуст?

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 31 июля 2010

Сверху головы:

Post.all(:joins => 'LEFT OUTER JOIN moderations m ON p.id=m.post_id AND m.user_id != #{id}')
0 голосов
/ 31 июля 2010

Я новичок в Ruby и подумал, что мне нужно написать программу для этого, на мой взгляд, конечный результат довольно плох, но я все равно решил выложить соответствующую часть здесь:

posts - moderations.select{|x| x.user_id == current_user}.collect{|x| x.post_id}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...