Ruby on rails 如何根据对象与其他对象的关系设置对象的属性';属性?
我有一个简单的高尔夫应用程序,对于每个球员我都有Ruby on rails 如何根据对象与其他对象的关系设置对象的属性';属性?,ruby-on-rails,ruby,activerecord,attributes,Ruby On Rails,Ruby,Activerecord,Attributes,我有一个简单的高尔夫应用程序,对于每个球员我都有:total_score和:current_place属性。我希望Rails根据每个玩家的:总分高于还是低于其他玩家来定义该玩家的:current\u place属性 换句话说,如果有两个玩家,一个玩家的:total_score=>5,另一个玩家的:total_score=>4,我希望Rails将第一个玩家的:current_place=>1,另一个玩家的:current_place=>2,依此类推。我基本上希望它根据:total_score列的降
:total_score
和:current_place
属性。我希望Rails根据每个玩家的:总分
高于还是低于其他玩家来定义该玩家的:current\u place
属性
换句话说,如果有两个玩家,一个玩家的
:total_score=>5
,另一个玩家的:total_score=>4
,我希望Rails将第一个玩家的:current_place=>1
,另一个玩家的:current_place=>2
,依此类推。我基本上希望它根据:total_score
列的降序定义:current_place
值 您可以通过一个观察者来实现这一点,在保存播放器时启动sql查询,然后更新属性(使用update_属性,这样它就不会触发回调)。但这不是一个很好的解决方案,也可能会有比赛条件的问题
另一个解决方案是在某个地方实现相同的查询,并使模型的当前位置函数访问结果。这也很容易缓存
代码:
classplayer
我没有测试它,但我想像这样的东西应该会起作用。要获得缓存的部分,您只需在Rails.cache.fetch块中包装所有位置,并在每次更新玩家总分时使其过期您可以通过观察者实现这一点,即在保存玩家时启动sql查询,然后更新属性(使用更新属性,这样它就不会触发回调)。但这不是一个很好的解决方案,也可能会有比赛条件的问题 另一个解决方案是在某个地方实现相同的查询,并使模型的当前位置函数访问结果。这也很容易缓存 代码:
classplayer
我没有测试它,但我想像这样的东西应该会起作用。要获得缓存的部分,您只需将所有位置包装在Rails.cache.fetch块中,并在每次更新玩家总分时使其过期可能重复或可能想尝试gem可能重复或可能想尝试gem
class Player < ActiveRecord::Base
def current_place
self.class.current_place(self.id) if self.id
end
def self.all_places
rank = {}
pos = 0
self.order_by('total_score desc').each{|p| rank[p.id] = (pos += 1)}
rank
end
def self.current_place(id)
all_places[id]
end
end