我有一个Rails应用程序。它有一个Feed,显示来自不同用户的项目混合在一起。在您看到这些项目的方式上,它会与Pinterest类似。
现在我按照创建日期显示所有这些项目。但是,由于项目是由用户按批次创建的,因此它们不会随机显示(例如,前6个项目来自一个用户,另外5个项目来自其他用户,等等。)
为这些项目提供服务的代码是:
class Feeder
def self.most_recent_created(watching_user=nil, current_cursor)
next_cursor = nil
feed = []
influencers_ids = User.influencers.distinct(:_id)
Rating.most_recent_from_influencers(watching_user, influencers_ids).scroll(current_cursor) do |rating, cursor|
next_cursor = cursor
feed << ImoPresenter.new(Imo.new(rating), watching_user)
end
feed << next_cursor.to_s
end
end
scroll只是给出一个指向迭代中每个项目的光标。然后我将项目推入Feed中。
对数据库的访问在Rating.most_recent_from_influencers(watching_user,influencers_ids)中完成,其中most_recent_from_influencers(watching_user,influencers_ids)是一个定义如下的范围:
scope :not_from, ->(user) { ne(user_id: user.id) }
scope :from, ->(user_ids) { any_in(user_id: user_ids) }
scope :most_recent_from_influencers, ->(watching_user, influencers_ids) {
proxy = from(influencers_ids).over_zero.desc(:created_at).limit(IMOS_PER_PAGE)
proxy = proxy.not_from(watching_user) if watching_user
proxy
}
MongoDB没有开箱即用的随机访问权限。他们建议this有一种随机访问项目的方法。基本上,解决方案是在所有文档中添加随机字段,并通过此字段对集合进行排序。但是,虽然我会有随机项目,但我会一直显示几乎相同的项目,因为我可以选择按desc(:rand)
或asc(:rand)
排序。
我想就如何以随机的方式真正展示物品提出建议。有可能吗?
答案 0 :(得分:0)
基于类似的问题,我得出的结论是,如果集合是动态的,那么随机字段是一个有效的解决方案,这意味着文档经常被插入。集合越动态,您就可以拥有越多的“随机”访问权限。