1

我希望能够存储用户最后 5 条评论,因此我创建了一个数组,并能够使用以下方法向数组添加评论:

comments << message

我只想要最后 5 条评论。有没有一种简单的方法(设置数组大小以便第 6 个下降)来实现这一点,而无需编写方法或存储每个注释然后只显示最后 5 个?

4

4 回答 4

3

如果我没记错的话,您使用的是 Rails。“Rails 方式”是使用关联

class User < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :user
end

现在您可以获得最后 5 条评论:

@current_user.comments.last(5)

如果您想/必须将您的评论存储在一个数组中,您可以用以下内容替换您的分配:

comments.push(message).slice!(0...-5)

以上添加message到数组并删除了除最后 5 个元素之外的所有内容。它也适用于多个项目:

comments.push(message1, message2).slice!(0...-5)
于 2013-10-02T12:47:02.777 回答
3

您可以创建自己的数据结构,非常轻松地将 Array 的功能包装在 ruby​​ 中:

class CommentQueue

  include Enumerable

  def initialize(num = 5)
    @size = num
    @queue = Array.new
  end

  def each(&blk)
    @queue.each(&blk)
  end

  def pop
    @queue.pop
  end

  def push(value)
    @queue.shift if @queue.size >= @size
    @queue.push(value)
  end

  def to_a
    @queue.to_a
  end

  def <<(value)
    push(value)
  end

end 

完毕。

于 2013-10-02T12:52:44.190 回答
1

在 Ruby 中,数组是动态的,这意味着您放入的数据越多,它们就会变得越大,而 Ruby 并没有为您提供所需的内置功能。所以如果你想要一个环形数据结构,你必须自己实现它。

一个快速而肮脏的环形数组实现可能类似于:

class Ring
    def initialize(s)
      @r = []
      @r.fill(nil, 0, 5)
      @s = s
    end
    def push(e)
       @r.shift
       @r.push e
    end
 end
于 2013-10-02T12:31:35.823 回答
0
if comments.size < 5 then
    comments << new_comment
else 
    oldest = comments.sort{|e| e.date}.last
    if oldest.date < new_comment.date then # comment is newer?
        comments[comments.index(oldest)] = new_comment #swapping
    end
end
于 2013-10-02T13:13:20.467 回答