一次更新多个对象的属性

时间:2014-04-19 22:21:01

标签: ruby-on-rails

有没有办法更新多个对象的属性? 我每次更新团队的胜负时,都会尝试更新用户的输赢。

我有三个模型链接在一起。

球员属于球队。我试图做到这一点,以便当用户加入团队时,它会创建一个名字和角色的玩家。

class Player < ActiveRecord::Base
    belongs_to :team
end

球队有很多球员。团队名称:字符串获胜:整数损失:整数。

class Team < ActiveRecord::Base
    has_many :players, dependent: :destroy
end

用户通过玩家拥有许多团队。因此,用户是他们加入的团队的参与者。在创建新玩家时,用户将他们的名字链接到玩家。用户拥有名称:string email:string wins:integer loss:integer

class User < ActiveRecord::Base
    has_many :players, dependent: :destroy
    has_many :teams, through: :players
end

所以在这一点上我想做的是,当我更新球队的输赢时,球员也会获得最新的胜负。我怎么解决这个问题?我试图在一个实例变量中加载所有团队用户,但它有多个玩家,我无法从那里更新胜利。

1 个答案:

答案 0 :(得分:0)

我不知道您的其他人申请,但根据您的问题,我建议您制作另一个模型Matches。您可以通过Team将其与has_many相关联。然后,您只需向团队添加赢/输比赛并设置模型,以便您可以创建类似

的查询

模型应如下所示。如果您希望多个团队播放相同的匹配并保存结果而不重复,则可以更好地设置它们(匹配可以有多个外键,如team1_idteam2_id)。或者,如果您还想绘制匹配项,保存分数等。对于您的要求,我只需要包含一个属性won

class Team < ActiveRecord::Base
  has_many :players, dependent: :destroy
  has_many :matches  
end

class Match < ActiveRecord::Base
  belongs_to :team

  def self.won
    where(won: true)
  end

  def self.lost
    where(won: false)
  end
end

现在这个查询应该有效:

team.matches.won.count

为团队添加匹配应该很简单:

team.matches.create(won: true)