복붙노트

[RUBY-ON-RAILS] 방법의 RoR에서 업적 시스템을 구현하는

RUBY-ON-RAILS

방법의 RoR에서 업적 시스템을 구현하는

내 루비 레일에 응용 프로그램에 업적 시스템을 구현하기 위해, 가난, 시도하고있다.

내가 확인하고 싶은 성과의 긴 목록을 가지고있다. 일부는 다양한 컨트롤러에서 작업을 생성하여 모든 트리거됩니다.

나는이에 반응하는 컨트롤러와 액션을 포함하는 성과 모델을해야한다는 생각을 했어. 그런 다음 생성 및 적용 성과에 대한 확인에 대한 필터 전에을한다. 실제로 업적을 실행 / 정의 할 때 나는 박히. 각 성과는 다른 데이터를 필요로 할 수있다. 예를 들어 한 사용자가 대답 얼마나 많은 질문이 알고 싶은 것를 들어, 다른 이들은했습니다, 사용자가 초대 세 번째 얼마나 많은 사람들이 반응 얼마나 많은 의견.

바로 DB에 실제로 단지 포함 모든 필요한 루비 코드에 할 수있는 가장 좋은 것은 무엇입니까? 우리가 사전에 설정이 무엇인지 알고에 대한 몇 가지 문제 (즉 CURRENT_USER 등) 여전히 있기는하지만 나는 모든 활성 기록 발견 등 반환 참 /의 거짓을하는자가 포함 된 블록을하고 볼 수 있습니다.

저를하지 않는 거기 합리적인 모범 사례 더러운 느낌? 즉 계획 (A)보다 더 나를 놀라게 수 있지만 나는 하나 개의 경로 인 정책 / 규칙 엔진에서 전체를 볼 수 있었다.

감사합니다! 귀

해결법

  1. ==============================

    1.나는 성취 모델을 사용하는 당신의 생각에 동의합니다.

    나는 성취 모델을 사용하는 당신의 생각에 동의합니다.

    당신은 아마하지만, 당신의 컨트롤러의 트리거를 구현하지 않아야합니다. 당신은 코멘트를 게시하는 두 가지 방법을 가지고 상상; 당신은 불가피하게 코드 중복을 얻을 것이다. 행동의이 종류는 모델에 속한다.

    당신은 사용자가 만드는 댓글의 수를 추적 할, 100 개 덧글에 대한 성과를 수여하자. 다음과 같은 모델을 할 수 :

    class User < ActiveRecord::Base
      has_many :comments
      has_many :achievements
    
      def award(achievement)
        achievements << achievement.new
      end
    
      def awarded?(achievement)
        achievements.count(:conditions => { :type => achievement }) > 0
      end
    end
    
    class Achievement < ActiveRecord::Base
      belongs_to :user
    end
    
    class Comment < ActiveRecord::Base
      belongs_to :user
    end
    
    class CommentAchievement < Achievement
      def self.check_conditions_for(user)
        # Check if achievement is already awarded before doing possibly expensive
        # operations to see if the achievement conditions are met.
        if !user.awarded?(self) and user.comments.size > 100
          user.award(self)
        end
      end
    end
    

    서로 다른 성과 성취 모델의 모든 서브 클래스이며, 그들은 단지 하나 개의 테이블에 저장되도록 단일 테이블 상속을 사용합니다. 서브 클래스는 각 개인의 성취에 필요한 모든 로직을 포함 할 수 있습니다. 당신은 또한 달성이 수여 된 날짜로,이 모델에 추가 정보를 저장할 수 있습니다. 데이터베이스가 중복 성과를 거부 있는지 확인하려면, 유형과 USER_ID 컬럼에 UNIQUE 인덱스를 만들 수 있습니다.

    당신이 원하는 때마다 CommentAchievement.check_conditions_for (사용자)를 호출 할 수 있습니다. 이제 다음 각을 실행하는 백그라운드 작업을 만들 수 있습니다, 또는 당신은 관찰자를 만들 수 있습니다 :

    # app/models/comment_achievement_observer.rb
    class CommentAchievementObserver < ActiveRecord::Observer
      observe :comment
    
      def after_create(comment)
        CommentAchievement.check_conditions_for(comment.user)
      end
    end
    
    # config/environment.rb
    config.active_record.observers = :comment_achievement_observer
    

    위는 물론 다른 사람이있을 수 있습니다, 그것은 작업을 수행하는 방법의 한 생각입니다. 이 코드는 단지 예를 들어, 나는 실제로 그것을 테스트하지 않았습니다. 희망이 당신에게 어떤 도움이 있습니다.

  2. ==============================

    2.정말 좋은 솔루션, molf.

    정말 좋은 솔루션, molf.

    나는 새로운 성과를위한 발전기와 플러그인 / 보석에이 압연 :

    http://github.com/paulca/paths_of_glory

    달성 해피!

  3. ==============================

    3.나는 배지, 포인트 순위 작동이 작업에 대한 레일 3 보석을 썼다. 당신은 https://github.com/tute/merit의 소스 코드를 찾을 수 있습니다.

    나는 배지, 포인트 순위 작동이 작업에 대한 레일 3 보석을 썼다. 당신은 https://github.com/tute/merit의 소스 코드를 찾을 수 있습니다.

  4. from https://stackoverflow.com/questions/885277/how-to-implement-an-achievement-system-in-ror by cc-by-sa and MIT license