我希望能够存储用户最后 5 条评论,因此我创建了一个数组,并能够使用以下方法向数组添加评论:
comments << message
我只想要最后 5 条评论。有没有一种简单的方法(设置数组大小以便第 6 个下降)来实现这一点,而无需编写方法或存储每个注释然后只显示最后 5 个?
如果我没记错的话,您使用的是 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)
您可以创建自己的数据结构,非常轻松地将 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
完毕。
在 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
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