1

Я хотел бы отсортировать мои ссылки, используя алгоритм, всю необходимую информацию можно получить из значений в моей таблице Links. Как я могу вернуть элементы, отсортированные по вычисленному элементу Score?Rails Сортировка по алгоритму

Схема https://gist.github.com/1326044

Индекс Действие https://gist.github.com/1326045

https://gist.github.com/1326050 Расчет времени

Алгоритм

# Score = (P-1)/(T+2)^G 
    # P = points of an item (and -1 is to negate submitters vote) 
    # T = time since submission (in hours) 
    # G = Gravity, defaults to 1.8 
+1

На уровне базы данных? –

+0

Я все еще новичок, я не уверен, что понимаю, что вы подразумеваете под уровнем базы данных. Я хочу избежать использования пользовательского SQL, потому что мой производственный код размещен на heroku, который использует postgresql, отвечает ли это на него? – Dru

+0

что у вас есть? – tokland

ответ

2

Я хотел бы сделать следующее:

Во-первых, в модели:

after_initialize :calculate_score 

attr_accessor :score 

def calculate_score 
    unless self.new_record? 
    time_elapsed = (Time.zone.now - self.created_at)/3600 
    self.score = (self.points-1)/(time_elapsed+2)^G # I don't know how you retrieve G 
    end 
end 

В контроллере:

@links = Link.all.sort_by(&:score) 
+0

Я искал документацию, чтобы понять after_initialize, будет ли это пересчитывать баллы, прежде чем их вытащить из таблицы? – Dru

+0

это будет вычислять счет каждый раз, когда вы получаете объект из базы данных, поэтому он будет также обновлен – apneadiving

+0

@Dru - Документация [Active Record Callbacks] (http://api.rubyonrails.org/classes/ActiveRecord/Callbacks. html) может немного помочь. В двух словах, всякий раз, когда вы успешно находите запись с помощью 'find' или создаете новый объект, для этого объекта будет запускаться обратный вызов' after_initialize'. – colinm

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