Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 如何根据对象与其他对象的关系设置对象的属性';属性?_Ruby On Rails_Ruby_Activerecord_Attributes - Fatal编程技术网

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