Ruby on rails 如何限制与对象关联的记录数量而不限制存储新记录的过程?

Ruby on rails 如何限制与对象关联的记录数量而不限制存储新记录的过程?,ruby-on-rails,ruby,database,record,Ruby On Rails,Ruby,Database,Record,我使用的是RubyonRails3.2.13,我想限制与对象关联的数据库记录的数量,而不限制存储新记录的过程。也就是说,我有一个文章类,有很多:评论,我希望每篇文章最多存储10篇评论,并在提交超过10篇的新评论时覆盖最旧的评论。例如,如果一篇文章提交了10篇评论,那么当为该文章提交新评论时,我希望检索最旧的评论并覆盖它(而不在数据库中创建新评论) 我想在Review模型中通过重写来实现这一点,当给定文章的数据库中有10个Review时,除了所有其他属性之外,还创建了

我使用的是RubyonRails3.2.13,我想限制与对象关联的数据库记录的数量,而不限制存储新记录的过程。也就是说,我有一个
文章
类,
有很多:评论
,我希望每篇文章最多存储10篇评论,并在提交超过10篇的新评论时覆盖最旧的评论。例如,如果一篇文章提交了10篇评论,那么当为该文章提交新评论时,我希望检索最旧的评论并覆盖它(而不在数据库中创建新评论)

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

我该怎么做



注:@bgates提出的解决方案可能很好,但我希望避免先销毁最旧的记录,然后再创建新的(或相反的)记录,因为通过采用@bgates的解决方案,记录
id
将随着时间的推移显著增长(例如:1,2,…,34,…,7897987987,…),因为新的评论会不断提交,大约每20秒。我是否应该担心
id
的增长?

这样做在数据库层是否有优势?在Rails级别,在保存后将
钩子添加到
Review
模型会更容易-

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

(假设article.reviews排序最早)

如果要更新最早的文章,可以使用
updated\u 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

然后,当你想创建一篇新文章时调用它

我希望避免先销毁最旧的记录,然后再创建新的(或反之亦然)记录。我这样认为是因为我希望继续使用相同的引用(
id
)来引用数据库中的记录,并且因为记录
id
将显著增长(例如:1,2,…,34,…,7897987987,…),因为新的评论会不断提交,大约每10秒提交一次。我是否应该担心
ids
的增长?我认为这不会是一个问题,当你得到那么多评论时,你将能够雇用10名全职DBA来为你担心。:)“你将能够雇用10名全职DBA”是什么意思?什么是DBA?数据库管理员-如果你有数以亿计的评论,你将在网站上赚足够的钱,请人告诉你这是否是一个问题。我敢肯定不是这样,即使你每秒钟增加一篇新的评论,你仍然需要3年多的时间才能获得1亿篇评论。别担心。我有正确的理由认为这是一个问题(问题中提到的文章和评论只是示例对象-我不能说这里有什么内容)。更重要的是,我需要更新现有记录,而不是像你建议的那样删除和创建这些记录。如果你在回调中使用这些代码,那么将要保存的评论就不应该保存。只需更新最旧的审查。也许我必须在相关的控制器
create
action而不是模型中处理我的问题。是的,你是对的。我没有仔细阅读答案(我已经更新了答案)。您不希望在回调中使用该方法。你可能想写一篇类似于
的文章。写一篇新的评论。这种方法的定义略有不同。但是,更新最早的审查的问题将以同样的方式解决