Как настроить default_scope в моем приложении для ведения блога, чтобы индекс заказывал записи по алгоритму, определенному в модели?Как определить значения системы репутации в модели
Если бы я использовал HackerNews-like formula для алгоритма ранжирования, как показано ниже, как я могу определить его в моей модели?
total_score = (votes_gained - 1)/(age_in_hours + 2)^1.5
votes_gained переменная зависит от Active_Record_Reputation_System и записывается следующее в моих просмотров:
votes_gained = @post.reputation_value_for(:votes).to_i
Наконец, age_in_hours довольно прямо вперед
age_in_hours = (Time.now - @post.created_at)/1.hour
Как я могу использовать эти цифры, чтобы упорядочить мой индекс сообщений блога? Я пытался выяснить, как правильно определить total_score
в модели, чтобы я мог добавить его в область по умолчанию как default_scope order("total_score DESC")
или что-то подобное. Прямая замена не сработала, и я не уверен, как «перефразировать» каждую часть формулы.
Как точно определить total_score
? Большое спасибо за понимание!
Основной вопрос, который я вижу здесь является то, что, в то время как вы должны дать SQL формулу так, что она может заказать записи, формула содержит вызов функции, которая должна быть оценена с помощью рубина, а именно 'reputation_value_for (: голосов) 'за каждый пост. SQL не может вызвать ruby для оценки функции. Формула может содержать только те термины, которые SQL может определить сам, например значения, хранящиеся в столбцах, или простые математические выражения, содержащие эти значения, или даже текущее время, которое вы можете получить либо путем перехода от рубина, либо с помощью SQL NOW. – cdesrosiers
Спасибо @cdesrosiers. Так будет ли решение создать столбец «total_score» в моей модели Post? Если да, есть ли простой способ сделать это? – umezo
Вы не можете хранить 'total_score', потому что это зависит от постоянно меняющегося параметра:' age_in_hours'. Все, что вам нужно сохранить, - 'vote_gained', которое нужно будет обновлять только тогда, когда кто-то голосует. Есть ли столбец: столбец? – cdesrosiers