Ruby二进制搜索问题 - 排序的数组/ x是零错误

时间:2017-07-26 08:53:26

标签: ruby-on-rails ruby

我知道有几个类似标题的问题因含糊不清而被关闭,所以我会尽量详细说明。

我有一个名为'徽章'的导轨模型,它有13个预定义的徽章对象。每个徽章对象都有一个称为“条件”的attr,它指定用户为达到徽章而必须达到的点数。

我的名为'reward_badge'的方法的代码是这样的:

@user = User.find(self.user_id)

conditions = Array.new(13)
Badge.all.each do |b|
  conditions << b.condition
end

badge = Badge.find(conditions.bsearch_index{|x| @user.points >= x} + 1)
@user.badges << badge unless @user.badges.include? badge

所以,我有一个名为'conditions'的排序数组,其中包含每个徽章的点数增量(例如[1,5,10,50 ......])。我希望获得的徽章的条件仅比用户的积分小,如果用户尚未拥有徽章,则获得徽章。

我认为ruby提供的'二分搜索'是实现这一目标的最佳方法。但是当我使用上面的代码时,我得到的错误是'x是nil'。 (更具体地说,错误说我不能使用运算符'&gt; ='作为nil obj)

我不知道如何解决这个问题,因为我认为我遵循了ruby库指定的内容......

目前,我决定暂时使用案例陈述。我真的希望使用这种二进制搜索方法来获得更清晰的解决方案。感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

要根据用户点获取徽章,请使用:

badge = Badge.where('condition <= ?', @user.points).order(:condition).last