#ruby-on-rails #ruby-on-rails-3 #scope
#ruby-on-rails #ruby-on-rails-3 #область действия
Вопрос:
Мне было интересно, допустим, у меня есть две модели, обсуждения и публикации. Сообщения принадлежат обсуждениям. У меня есть пользовательское действие в модели обсуждения, которое проверяет последнюю активность объекта, проверяя дату создания его новейшего post. ie
def latest activity
self.posts.last.created_at || self.created_at
end
Могу ли я написать область, которая упорядочивает объекты модели этим методом, а не, скажем, столбец в модели обсуждения?
scope :latest_activity, #what to put here?
Ответ №1:
есть ли причина, по которой вы не хотите изменять родительский элемент? В Rails есть встроенный метод touch для этой точной вещи. Например: belongs_to :обсуждение, :touch =>:last_reply_at сделает так, что всякий раз, когда ответ изменяется (создается / обновляется), родительское поле будет обновляться со временем. теперь отметка времени. Одним из преимуществ этого будет возможность не запрашивать дочерние элементы каждый раз, когда вы хотите узнать, какое обсуждение имеет последний ответ.
Взгляните на http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
Редактировать
Другим способом сделать это было бы добавить фильтр, например after_create при обновлении post поля с текущим временем в модели обсуждения.
Комментарии:
1. причина, по которой я не изменяю родительский элемент, заключается просто в том, что я чувствую, что было бы излишним добавлять это поле к родительскому элементу, а затем также обновлять с каждым сообщением. это ошибочно?
2. я вижу, как это было бы альтернативным решением. Но, согласно вопросу, есть ли способ расширить область действия без записи поля в родительском (и области действия через метод)?
3. Попробуйте это: область действия:latest_activity, включает(:posts).order(«posts.created_at DESC»)
4. отлично! Если вы добавите эту строку в свой ответ, я буду приписывать ответ вашему ответу. (Вы также можете оставить остальную часть ответа, все это актуально)
5. .. на самом деле, секундочку, нужно кое-что проверить с этим.