0

我正在使用 Ruby on Rails 3.2.13,我想限制与对象关联的数据库记录的数量,而不限制存储新记录的过程。也就是说,我有一个Article班级,has_many :reviews我希望每篇文章最多存储 10 条评论,并在提交超过 10 条的新评论时覆盖最旧的评论。例如,给定一篇文章提交了 10 条评论,当为该文章提交新评论时,我想检索最旧的评论并覆盖它(而不在数据库中创建新评论)。

我想Review通过覆盖在模型中实现这一点,当给定文章的数据库中存在 10 条评论时,created_at除了所有其他属性之外,该属性。换句话说,我想避免创建新记录(使用新记录id),而是使用刚刚提交的新数据更新最旧的记录,以便存储 10 个最近的评论。它似乎像 FIFO 队列一样工作。

我怎么能/应该做到这一点?


注意:@bgates 提出的解决方案可能很好,但我想避免破坏最旧的记录然后创建新的(或反之亦然)记录,因为通过采用@bgates 的解决方案,记录ids会随着时间的推移而显着增长(例如:1 , 2, ..., 34, ..., 7897987987, ...) 因为新评论不断提交,大约每 20 秒一次。我应该担心增长ids吗?

4

2 回答 2

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

然后在您要创建新文章时调用它

于 2013-07-24T23:30:37.700 回答
0

这样做在数据库层有优势吗?在 Rails 级别,向模型添加after_save挂钩会更容易-Review

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

(假设 article.reviews 是从旧到先排序的)

于 2013-07-24T21:35:26.133 回答