使用assign_attributes激活订单活动记录

问题描述 投票:0回答:1

我有一个用户模型,它的评分模型的值是score。在Rails视图中,我想按分数对用户进行排序。=>User.joins (: scoring) .order (: score)到目前为止,一切都很好。当我根据某些属性(例如地理位置)动态更改某个用户的分数而不在数据库中修改它们的分数时,它变得很复杂。我尝试了assign_attributes函数,但它没有改变,因为.order函数调用数据库中的得分字段。

用例:我通过地理位置进行用户搜索,地理位置附近的用户及其得分会显示在我的搜索中。我想加权附近用户的分数,因为他们不在确切的地理位置上

我的代码:

  #Get scoring in other geolocation
  @fiches_proxi = Fiche.joins(:user).merge(User.joins(:scoring)).near([@geo.lat_long_DMS.to_f, @geo.lat_long_grd.to_f], proxi_calcule(@geo.population_2012.to_i),units: :km, :order => 'scorings.score DESC').order('scorings.score DESC').where.not(geo: @geo.id).limit(10)

  #Get scoring in real geolocation
  @fiche_order_algo_all = Fiche.joins(:user).merge(User.joins(:scoring)).where(geo_id: @geo)

  #Find all scores
  @fiches_all = Fiche.where(id:  @fiche_order_algo_all.pluck(:id) +  @fiches_proxi.pluck(:id))

  @pagy, @fiche_order_algo = pagy(@fiches_all.joins(:user).merge(User.joins(:scoring).order('scorings.score DESC')), items: 12)

  @fiche_order_algo.each do |f|
    if f.geo.id != @geo.id
      f.user.scoring.assign_attributes(score: (f.user.scoring.score - 10.0))
    else
       f.user.scoring.score
    end
  end

我的分数已更新,但我的订单不变!

ruby activerecord ruby-on-rails-5
1个回答
0
投票

当您在关系上调用.each时,它将返回一个数组,因此您可以使用Array#sort_by

@fiche_order_algo.each do |f|
  if f.geo.id != @geo.id
    f.user.scoring.assign_attributes(score: (f.user.scoring.score - 10.0))
  else
     f.user.scoring.score
  end
end

@fiche_order_algo.sort_by{|f| f.scoring.score}

如果您使用的是大型数据集,可能不会对其进行优化,但是效率不会比您已有的效率低。

© www.soinside.com 2019 - 2024. All rights reserved.