2013-12-18 4 views
6

У меня есть приложение с комментариями и комментариями. В моем действии/представлении индекса я повторяю сообщение и отображаю его из самого последнего созданного на старое, созданного в. Мои комментарии вложены в мои сообщения, поэтому в моем представлении/представлении показать, я хочу итерации, хотя комментарии и получить их, чтобы показать из недавно созданных на старейших, созданных на. Кажется, я могу заставить это работать, если я создам метод в моем файле post.rb. У меня есть это:Добавление функции created_at DESC в Rails

post.rb:

def newest_comments 
    self.comments.order("created_at DESC") 
    end 

На мой пост шоу зрения, я могу перебирать оставлять комментарии и он прекрасно работает:

<% @post.newest_comments.each do |comment| 
<% end %> 

, но я хочу, чтобы установить это функциональность в слое контроллера, но я не могу понять, как это сделать. Это то, что я имею в шоу действия в мой контроллер сообщений:

def index 
    @posts = Post.all.order("created_at DESC") 
    end 

    def show 
    @comment = Comment.new 
    @comments = Comment.all.order("created_at DESC") 
    end 

и теперь мой обновленный вид пост-шоу:

<% @post.comments.each do |comment| %> 
<% end %> 

@post ВДП там из-за моего перед действием. Поэтому мой вопрос: почему у меня нет доступа к этому ivar в моем представлении после показа, просто называя это в моем представлении?

+0

не связан с вашим вопросом, но это не очень хорошая практика для использования методов self в классе. – airy

+0

Правильно, это еще одна причина, по которой я хочу переместить это из своего модельного слоя. – user2045764

ответ

1

вы можете определить порядок в пост модели:

class Post 
    has_many :comments, :order => 'created_at DESC' 
    # ... 
end 
+0

Большое вам спасибо, я никогда не знал, что вы можете добавить это на модельный слой. Знаете ли вы, как я мог бы это сделать на уровне контроллера? Я все еще новичок в Rails, но теперь я видел, как это делается на уровне модели через метод def, ваш путь на уровне модели и через слой контроллера ... любые лучшие практики? – user2045764

+0

, вы также можете попробовать has_scope gem для условной сортировки/фильтрации – airy

7

Вы можете использовать сферу

class Comment < ActiveRecord::Base 
    scope :newest_first, order(created_at: :desc) 
end 

затем использовать его как

@comments = Comment.newest_first 

И @comments собирается заказать

+0

Возможно, вам понадобится сделать тело области видимым (для оценки содержимого блока при каждом использовании области). Для этого используйте: 'scope: newest_first, -> {order (created_at:: desc)}' –

1

Сейчас ваш код действия шоу похож на возвращение всех комментариев, вместо комментариев, связанных с сообщением. Чтобы получить доступ к @post в представлении просмотра, вам необходимо обновить действие шоу таким образом.

def show 
    @post = Post.find(params[:id]) 
    @comment = @post.comment.new 
    @comments = @post.comments.order("created_at DESC") 
end 

Таким образом, вы можете получить доступ к @post и @comments в Show view.

И теперь обновляется после шоу представления, как это, чтобы показать комментарии:

<% @comments.each do |comment| %> 
<% end % 

Также для вас может пользовательский объект @post с точки зрения, а также в случае необходимости. @comments для нового комментария.

Вы можете увидеть это сообщение-комментарий приложение на Rails-гидами http://guides.rubyonrails.org/getting_started.html#showing-posts Другие полезные ссылки: http://www.reinteractive.net/posts/32-ruby-on-rails-3-2-blog-in-15-minutes-step-by-step

0

использовать это в вашем замечании модели для заказа набор по умолчанию:

default_scope { order("created_at DESC") } 
8

С updates to Rails вы можете не используйте синтаксис SQL created_at DESC с примерно следующим кодом:

@comments = @post.comments.order(created_at: :desc)

Смежные вопросы