Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails的作用域,它根据信誉评分对用户进行排序_Ruby On Rails_Ruby On Rails 4_Scope_Filtering - Fatal编程技术网

Ruby on rails Rails的作用域,它根据信誉评分对用户进行排序

Ruby on rails Rails的作用域,它根据信誉评分对用户进行排序,ruby-on-rails,ruby-on-rails-4,scope,filtering,Ruby On Rails,Ruby On Rails 4,Scope,Filtering,我有一个用户表,我对每个用户都有一个声誉分数。声誉得分是两个因素的综合得分: 用户项目(他/她创建的项目)的关注者总数 用户任务(他/她创建的任务)的总投票数 我的目标是允许用户按最近的(标准索引操作)或信誉最高的用户筛选用户。Rails的哪个范围会按照从最高到最低的顺序返回按此“总声誉分数”排序的用户列表?thx 我的代码如下: User.RB模型 def total_reputation_score project_follower_count + task_vote_count end

我有一个用户表,我对每个用户都有一个声誉分数。声誉得分是两个因素的综合得分:

  • 用户项目(他/她创建的项目)的关注者总数

  • 用户任务(他/她创建的任务)的总投票数

  • 我的目标是允许用户按最近的(标准索引操作)或信誉最高的用户筛选用户。Rails的哪个范围会按照从最高到最低的顺序返回按此“总声誉分数”排序的用户列表?thx

    我的代码如下:

    User.RB模型

    def total_reputation_score
      project_follower_count + task_vote_count
    end
    
    scope :by_reputation, -> { #HOW DO I CREATE THIS SCOPE? }
    
    用户控制器

    def index
      @users = User.text_search(params[:query]).paginate(page: params[:page], :per_page => 12)
    end
    
      def most_reputation
        @users = policy_scope(User)
        @users = @users.
          text_search(params[:query]).
          by_reputation.
          paginate(page: params[:page], :per_page => 12)
    
        render :index
      end
    
    虽然您可以在SQL中动态执行此操作,但您确实希望:

    为此处显示的两个计数项中的每一项添加一个;这会将这些列添加为Rails将为您维护的计算列,然后为您的范围执行以下操作:

    User.order(User.arel_table[:project_follower_count] + User.arel_table[:task_vote_count]).reverse_order
    
    (或类似的东西)


    或者,您可以在RDBMS上加倍,并构建索引以便动态处理

    谢谢corey-为了确保我能理解。。。只需在Users表中添加一个新的整数字段,用于project\u follower\u count和task\u vote\u count。一旦我有了这些,我就可以做:范围:按声誉,->{User.order(User.arel\u table[:project\u follower\u count]+User.arel\u table[:task\u vote\u count)。颠倒顺序}是这样的,还是我不再需要这个范围了?@BB500我会使用一个范围,是的。你还需要设置计数器缓存。现在在手机上,但你可以通过谷歌查找文档/示例。@BB500为什么会有很多任务投票?对我来说似乎是一种归属关系。对“项目追随者”不确定,取决于体系结构。@BB500明白了;一般来说,混乱的体系结构会导致大量的下游工作。如果您负担得起,可能值得花时间进行修改和简化。您对内置功能的依赖程度越高,测试或维护的工作量就越少!