ruby - Rails 使用 assign_attributes 订购活动记录
问题描述
我有一个 User 模型,它有一个 Scoring 模型,它有一个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}
如果您正在处理大型数据集,这可能不会被优化,但不会比您已有的效率低任何。
但您也可以一次性完成:
@fiche_order_algo.sort_by! do |f|
if f.geo.id != @geo.id
f.user.scoring.assign_attributes(score: (f.user.scoring.score - 10.0))
end
f.user.scoring.score
end
推荐阅读
- powershell - Azure 发布管道 Powershell 任务失败
- linux - 使用 awk 左外连接基于多列的两个 csv 文件,同时保持第一个文件观察的顺序
- c# - IdentityServer4 作为外部提供者,如何避免注销提示?
- c# - ASP.NET Core 2.2 临时目录在哪里?
- javascript - 使用 if meteor/blaze 语句延迟更新
- r - 如何在 predict() 函数中使用的 newdata data.frame 中指定随机效果名称?- lme4
- java - 正则表达式从文件中检索双数,但忽略具有多个点的数字
- excel - 动态 vLookUp
- shell - 如何自动下载 shell 脚本中远程 ftp 文件夹中的所有较新文件?
- android - SAF - 文件写入父文件夹,而不是正确的路径