사용자가 게임용 포인트를받는 앱이 있습니다. 내 코드에서 GameTRank 테이블의 지난 주 Game_Type을 사용하여 각 사용자의 점수를 소계하고 순위를 매기는 버그가 있습니다. 사용자가 지난 주 동안 포인트를 가지고 있다면 잘 작동하지만 지난 주 포인트가없는 사용자는 올바르게 작동하지 않습니다. 사용자가 점수가없는 경우 GameTypeRank에서 0 점으로 업데이트해야하며 그렇지 않은 경우 업데이트 할 때까지 마지막 순위를 유지합니다 (순위가 잘못됨).레일 : 레일 관련 버그 검색어 :
# user.rb:
def self.update_game_type_weekly_rank
@game_types = GameType.all
@game_types.each do |game_type|
# this query is where the bug is since it is possible a User has no Points
@user_with_points = Point.where("game_type_id = ? and created_at >= ?", game_type.id, 1.week.ago).sum(:points, :group => :user_id, :order => 'sum(points) desc')
rank = point_counter = 0
@user_with_points.each do |user_id, points|
@game_type_rank = GameTypeRank.find_or_create_by_user_id_and_game_type_id(user_id, game_type.id)
if points != point_counter
point_counter = points
rank += 1
end
@game_type_rank.weekly_rank = rank
@game_type_rank.weekly_points = points
@game_type_rank.save
end
end
end
# Models
# game_type_rank.rb
# fields - user_id, game_type_id, weekly_points, weekly_rank
belongs_to :game_type
belongs_to :user
# point.rb
# fields - user_id, points, game_type_id
belongs_to :game
belongs_to :game_type
belongs_to :user
나는 매주 실행하고 주에 대한이 없었 각 사용자에 대한 (Point.points = 0) 포인트 레코드를 작성하지만 가난한 솔루션입니다 방법을 만들 수
.
또한 메서드 시작 부분에 각 GameTypeRank 레코드에 대해 weekly_points
및 weekly_rank
을 초기화 할 수는 있지만 이는 나에게 비효율적 인 것으로 보입니다.이 작업을 수행하는 가장 좋은 방법은 확실치 않습니다.
# Sample Data
Points
|user_id|points|game_type_id|created_at
|1 | 10 | 1|2013-05-07
|1 | 10 | 2|2013-05-07
|2 | 20 | 2|2012-12-31
|1 | 5 | 2|2012-12-31
before weekly_update - Game_Type_Ranks
|user_id |game_type_id | weekly_points | weekly_rank|
|1 |2 |5 |2
|2 |2 |20 |1
after weekly_update - Game_Type_Ranks
|user_id |game_type_id | weekly_points | weekly_rank|
|1 |1 |10 |1
|1 |2 |10 |1
|2 |2 |20 |1
what should happen after weekly_update - Game_Type_Ranks
|user_id |game_type_id | weekly_points | weekly_rank|
|1 |1 |10 |1
|1 |2 |10 |1
|2 |2 |0 |2 <== update for user_id 2
예상되는 실제 출력과 함께 일부 샘플 입력 데이터가 유용합니다. –
몇 가지 샘플 데이터를 추가했습니다. 감사합니다. – yellowreign
이번 주에 활동하지 않은 사용자에게는 주당 0 점이 필요합니까? 우리가 그들을 버릴 수 있을까요? – bennick