Ruby on rails Rails/Mongoid保存可排序有序列表的最佳方法

Ruby on rails Rails/Mongoid保存可排序有序列表的最佳方法,ruby-on-rails,gem,mongoid,jquery-ui-sortable,Ruby On Rails,Gem,Mongoid,Jquery Ui Sortable,我已经从数据库中提取了一个可排序的玩家列表。用户可以根据自己的喜好对其进行排序 在与每个玩家的偏好相关联的数据库中存储该顺序并以相同顺序检索玩家统计信息的最佳方法是什么 现在我正在通过@playersdraftlist=@draftlist.map{| id | Player.find(id)}进行检索,但这会多次命中数据库 所以,目前,我有一个用户模型和一个草稿模型。草稿只有关联的用户id 1) 将被征召人员存储为用户字段而不是单独的模型是否更好 2) 当我需要保留副本和订单时,有没有更好的方

我已经从数据库中提取了一个可排序的玩家列表。用户可以根据自己的喜好对其进行排序

在与每个玩家的偏好相关联的数据库中存储该顺序并以相同顺序检索玩家统计信息的最佳方法是什么

现在我正在通过
@playersdraftlist=@draftlist.map{| id | Player.find(id)}
进行检索,但这会多次命中数据库

所以,目前,我有一个用户模型和一个草稿模型。草稿只有关联的
用户id

1) 将被征召人员存储为用户字段而不是单独的模型是否更好

2) 当我需要保留副本和订单时,有没有更好的方法来存储这样的列表

结构:

PlayerDraft
模型具有关联的
用户id

  draftees: [
    "52f4fd9f52e39bc0c15674ea", #Peyton
    "52f4fd9f52e39bc0c15674eb", #Tom
    "52f4fd9f52e39bc0c15674ea"  #Peyton
  ],
  user_id: "52f581096b657612fe020000"
@draftees=Draft.find(user\u id=current\u user.\u id)。首先.draftees
将返回draftees数组

调用
Player.find(@draftees)
将删除副本并按id排序

编辑

以下是我糟糕的解决方案:

  def index
    @players = Player.all

    if current_user.draft_list.draftees == [""]
      @playersdraftlist = ""

    else
      # Get all picks for current user
      @picks = current_user.draft_list.draftees
      @draft = Player.find(@picks)
      @playersdraftlist = @picks.map { |id| Player.find(id) }

    end
  end

实现这一点的方法是在mongoid中使用身份映射。 这里有更多关于这方面的详细信息:

但要做到这一点,最简单的方法是在
mongoid.yml
中设置以下属性:
identity\u map\u enabled:true

然后搜索以下内容:
Player.find(@draftees)
这将按照您传入的阵列的顺序返回您的新兵。一个警告是,它不会返回重复项,因此上面的
@draftees
数组(如果使用)将只返回两个值(顺序基于id的第一次出现,因此它将首先返回id为“52f4fd9f52e39bc0c15674ea”的播放机,然后返回id为“52f4fd9f52e39bc0c15674eb”的播放机)。因此,您必须通过某种抽象来重新创建副本

以下是一种可能的方法,其灵感来源于@muistooshort发布的以下评论:

User
类中添加以下函数

def get_draftee_list
  players = Player.find(self.draftees).each_with_object({}) { |p, h| h[p.id] = p } 
  return self.draftees.map { |id| players[Moped::BSON::ObjectId.from_string(id)] }
end
注意:这是在Mongoid 3上测试的


这应该可以解决您的问题,因为每次调用
raw\u data.find(id)
都是从存储在内存中的初始查询中搜索结果集,而不是对数据库进行另一次查询参见我的更新。这解释了吗?好消息。你的答案是正确的,但要完全统计,我需要知道如何包含重复项。到目前为止,我最好还是使用哈希映射。好的,我已经更新了答案,告诉你我将如何做,这样你就不会连续调用数据库了。我期待现在的投票结果:很好。如果需要,我会更新我的项目并澄清。非常感谢。这应该比我目前的方法便宜,对吗?我想会的,但是你应该检查你的日志,看看你以前的方法用了多长时间,而这个方法只需要确认多长时间。我建议你将new relic gem添加到你的应用程序中,看看每种方式产生多少DB查询,以及返回每个查询需要多长时间query@alalani,我离你越来越近了…我得拉一下小提琴。注意:对于mongoid-4,
Moped::BSON
只是
BSON
:)