我有一个用户模型,它的评分模型的值是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
我的分数已更新,但我的订单不变!
当您在关系上调用.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}
如果您使用的是大型数据集,可能不会对其进行优化,但是效率不会比您已有的效率低。