2013-07-24 1 views
0

Я использую Ruby on Rails 3.2.13, и я хотел бы ограничить количество записей базы данных, связанных с объектом без, ограничивающих процесс хранения новых записей. То есть, у меня есть класс Article, который has_many :reviews, и я хотел бы хранить максимум 10 обзоров на статью и перезаписывать старейший отзыв, когда будет отправлено новое, более десяти. Например, учитывая, что 10 обзоров были представлены для статьи, когда для этой статьи был представлен новый обзор, я хотел бы получить самый старый обзор и перезаписать его (без создания нового обзора в базе данных).Как ограничить количество записей, связанных с объектом, не ограничивая процесс хранения новых записей?

Я думал сделать это в модели Review путем перезаписи, когда в базе данных для данной статьи содержится 10 обзоров, атрибут created_at в дополнение ко всем остальным атрибутам. Другими словами, я хочу избежать создания новой записи (с новым id), но обновить самую старую с новыми данными, которые были отправлены таким образом, чтобы сохранить 10 последних обзоров. Кажется, он работает как очередь FIFO.

Как я могу это сделать?


Примечание: Решение, предложенное @bgates может быть хорошим, но я хотел бы избежать уничтожения старейшей, а затем создать новые (или наоборот) записи, потому что, приняв решение согласно @bgates', запись ids (например: 1, 2, ..., 34, ..., 7897987987, ...) с новые отзывы постоянно представлены, примерно каждые 20 секунд. Должен ли я беспокоиться о росте ids?

ответ

0

Есть ли преимущество в слое базы данных для этого? На уровне Rails легче было бы добавить after_save крюк в Review model-

def purge_old_reviews 
    while article.reviews.count > 10 
    article.reviews.first.destroy 
    end 
end 

(предполагающие article.reviews сортируются старейшей-первых)

+0

Я хотел бы избежать уничтожения старейшей, а затем создать новые (или наоборот) записи. Я так думаю, потому что я хотел бы продолжать использовать те же ссылки ('ids') для записей, присутствующих в базе данных, и потому что запись' ids' значительно возрастет (например: 1, 2, ..., 34, ..., 7897987987, ...), так как * новые отзывы отправляются постоянно *, примерно каждые 10 секунд. Должен ли я беспокоиться о росте «Ид»? – Backo

+0

Я не думаю, что это будет проблемой, и к тому времени, когда вы получите много обзоров, вы сможете нанять 10 администраторов баз данных в полном объеме, чтобы беспокоиться об этом за вас. :) – bgates

+0

Что вы имеете в виду «вы сможете нанять 10 администраторов баз данных в полный рабочий день»? Что такое администратор баз данных? – Backo

0

Если вы хотите обновить старую статью, вы можете использовать атрибут updated_at.

что,

def write_new_review 
    reviews = article.reviews 
    if reviews.length > 10 
     oldest_review = reviews.limit(1).order('updated_at ASC') 
     oldest_review.update_attributes({your: updates}) 
    else 
     # add new review 
    end 
end 

затем вызвать его, когда вы хотите создать новую статью

+0

Если вы используете этот код в обратном вызове, просмотр, который будет сохранен, не должен сохраняться. Только старейший обзор должен быть обновлен. Возможно, мне нужно обработать мою проблему в связанном с контроллером 'create', а не в модели. – Backo

+0

Да, ты прав. Я не читал ответ достаточно близко (я обновил свой ответ). Вы не захотите использовать этот метод в обратном вызове. Вы хотите сделать что-то вроде 'article.write_new_review'. Этот метод будет иметь несколько иное определение. Но вопрос об обновлении самого старого обзора будет решен таким же образом –

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