尝试在Rails控制器中做一些非常简单的事情。现在,我正在向用户显示与记分板表中的user_id
匹配的所有结果。
我现在想调整它以显示他们user_id
的结果,但也只scores
大于整数 0。所以我将控制器更改为:
def index
@scoreboards = Scoreboard.where(user_id: current_user.id, "score >= 0").order(score: :desc)
end
这会收到语法错误,所以我在.where
中的比较可能是错误的。我应该如何添加第二个条件?
我尽量避免将这些类型的数据库操作直接放在控制器中,因为模型是更合适的位置。 我会在模型中编写三个范围:
class Scoreboard < ActiveRecord::Base
#...
scope :for_user_id, ->(user_id) { where(user_id: user_id) }
scope :with_scores, -> { where('score > 0') }
scope :by_descending_score, -> { order(score: :desc) }
#...
end
。然后在控制器中,你只需要写这个:
Scoreboard.for_user_id(current_user.id).with_scores.by_descending_score
这使控制器更薄(且更具可读性),同时可能支持以最原子的方式重用这些查找,并使数据库逻辑完全包含在模型中。
我会试试这个:
@scoreboards = Scoreboard.where(user_id: current_user.id)
.where("category >= 0").order(score: :desc)