2013-08-20 2 views
0

Я пытаюсь создать приложение типа Reddit, где порядок списка зависит от сочетания количества upvotes, которые имеет ссылка, и созданной даты. Мой план состоит в том, чтобы создать новый столбец в моей таблице «Ссылки», которая объединяет «created_date» и «upvotes» в «Rank Value», а затем сортирует список по «Rank Value».В Ruby/Rails, как я могу создать один столбец в таблице на основе значения двух других столбцов в одной таблице?

Это правильный подход? Если да, как мне создать столбец таблицы с помощью ActiveRecord?

+1

Посмотрите на [обратный вызов] (http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html) api, особенно 'before_save'. – bdares

+0

Вам может не понадобиться новый столбец. Если комбинация достаточно проста, почему бы не модельный метод, который бы возвращал результат. Как и в @ post.rank_value, где #rank_value - это метод, реализующий комбинацию. Теперь это зависит от того, как вы собираетесь объединить два столбца (например, самую последнюю или последнюю последнюю дату?). Как только вы знаете, какая комбинация, это выглядит просто. –

+0

@ EricPlaton это может быть сложно отсортировать, если вы реализуете его как метод. – bdares

ответ

1

Если есть мета атрибут, который используется исключительно для целей отображения, создание метода, будет генерировать его «на лету».

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

before_save :calculate_rank 

def calculate_rank 
    self.rank = self.upvotes + self.clicks * 5; 
end 

К сожалению, для вашего случая использования вы конкретно сказали, что ваша колонка зависит от даты создания, вероятно, с точки зрения " как это свежо »- движущаяся цель.

Вы можете решить эти два способа: постоянно увеличивая значения rank для более новых ссылок на неопределенный срок, или помещая предметы во временные ведра и периодически их обновляя (ухудшая их результаты, когда возможно конец дня или недели).

0

Вы можете создать методы в модели, такие как «rank_value», который будет сортировать по вашим критериям и просто называют Model.rank_value

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