2012-05-25 2 views
1

Я в настоящее время система голосования осуществляется в мое приложение, и я сортирует сообщения по количеству голосов с этим кодом, на мой взгляд:Сортировка сообщений по количеству голосов в течение определенного промежутка времени

<%= render @posts.sort_by { |post| post.votes.count }.reverse %> 

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

ответ

0

я понял, еще один способ сделать это, хотя я ценю вашу помощь не может быть самым чистым способом, но я сделал

def most 
    range = "created_at #{(7.days.ago.utc...Time.now.utc).to_s(:db)}" 
    @posts = Post.all(:conditions => range) 
    @title = "All Posts" 
    @vote = Vote.new(params[:vote]) 

    respond_to do |format| 
     format.html 
     format.json { render :json => @users } 
    end 
    end 

для моего контроллера

создал маршрут/больше всего: в = > 'posts # most'

и сделал вид с оригинальным кодом, который у меня был на мой взгляд.

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

2

Это неправильно. Вы должны выполнить всю операцию сортировки на стороне базы данных. В этом примере рассмотрим использование Arel для создания сложных запросов или рассмотрим создание столбца кэша счетчика.

1

Вы можете просто добавить область для вашей модели сообщений, что-то вроде:

scope :five_days_ago, lambda { where("created_at >= :date", :date => 5.days.ago) } 

Тогда просто настроить ваш метод отрисовки к следующему:

<%= render @posts.five_days_ago.sort_by { |post| post.votes.count }.reverse %> 

Это предполагает, что вы хотите сохранить структуру ты используешь. Очевидно, что, как и другие предлагаемые, все это в базе данных - лучший способ действий.

+0

Когда я делаю @ posts.five_days_ago, это говорит о неопределенном методе 'five_days_ago 'для #

+0

Это еще одна проблема с этим методом. five_days_ago должно прибыть до сортировки (например, @ posts.five_days_ago.sort_by ...) –

1

luacassus is right. Это лучше сделать делегировать сортировку в базу данных, по крайней мере по двум причинам:

  1. Performance
  2. Вы можете цепь более методы запроса на него (необходимый для пагинации, например).

Счетчик кеша, вероятно, лучшая идея, но для сложного запроса позвольте мне сделать снимок. В сообщении модели:

class << self 
    def votes_descending 
    select('posts.*, count(votes.id) as vote_count').joins('LEFT OUTER JOIN votes on votes.post_id = posts.id').group_by('posts.id').order('votes_count desc') 
    end 

    def since(date) 
    where('created_at >= ?', date) 
    end 

end 

Итак ...

@posts = Post.votes_descending.since(5.days.ago) 
0

Действительно, это будет лучше, чтобы позволить дб сделать сортировку. Я хотел бы сделать что-то вроде

class Post < ActiveRecord::Base 
    default_scope :order => 'created_at DESC' 
end 

тогда вы всегда будете иметь ваши сообщения отсортированные и если я не ошибаюсь, последний должен быть первым вы получите, так что подставляет свой «обратный» звонок. Затем вы можете использовать область, опубликованную выше, чтобы получить только 5 дней старых сообщений. Также проверьте, есть ли индекс в столбце created_at в db. Вы можете сделать это с помощью

SHOW INDEX FROM posts 

ДБ будет делать это намного быстрее, чем рубин.

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