У меня есть три классазапросов и сортировки встроенный документ в Mongoid
class Post
include Mongoid::Document
include Mongoid::Timestamps
belongs_to :user, :inverse_of => nil
embeds_many :comments, :as => :commentable
field :content, :type => String
end
class Commment
include Mongoid::Document
include Mongoid::Timestamps
belongs_to :user, :inverse_of => nil
embedded_in :commentable, :polymoriphic => true
end
class User
has_many :posts, :dependent => :destroy
field :name, :type => String
end
Всякий раз, когда пользователь создает новый комментарий, я хочу, чтобы сравнить ее содержимое с последним комментарием, что пользователь сделал. Вот мой код, который выбирает последний комментарий по пользователю:
comments_user=[]
Post.where("comments.user_id" => user.id).
only(:comments).
each {|p| comments_user += p.comments.where(:user_id => user.id).to_a}
latest_comment = comments_user.sort_by{|comment| comment[:updated_at]}.reverse.first
Приведенный выше код дает мне результат, но подход не эффективен, как я должен пройти через все посты, которые пользователь commmented найти последний комментарий. Если таковые имеются, может ли кто-нибудь предоставить мне более эффективное решение этой проблемы? Проще говоря, не могу ли я получить все комментарии этого пользователя?
Ok ... но сейчас я не хочу, чтобы изменить модель только для выполнения этого запроса. Разве нет никакого обходного пути, которое дает мне результат? Хорошо, если результат работает для большинства случаев. :) –
Да, это работает, но это неэффективно. Он выполняет поиск по всем сообщениям, которые пользователь прокомментировал. Решение не является масштабируемым. Если возможно, я хочу что-то эффективное и дает мне ответ в большинстве случаев. –
Невозможно сделать эффективный запрос с помощью вашей текущей схемы. –