【问题标题】:Ruby on Rails: Calling an instance method from another modelRuby on Rails:从另一个模型调用实例方法
【发布时间】:2012-12-26 00:46:24
【问题描述】:

我有一个 Match 模型和一个 Team 模型。 我想在保存匹配后运行一个实例方法(在 Team 模型中编写)。这就是我所拥有的。

team.rb

def goals_sum
  unless goal_count_cache
    goal_count = a_goals_sum + b_goals_sum
    update_attribute(:goal_count_cache, goal_count)
  end
  goal_count_cache
end

它有效。现在我需要在保存比赛时运行它。所以我尝试了这个:

match.rb

after_save :Team.goals_sum
after_destroy :Team.goals_sum

而且它不起作用。 我知道我缺少一些基本的东西,但我仍然无法完成它。有什么建议吗?

【问题讨论】:

  • 那你为什么不把它放在Match呢?
  • 比赛模型是否与参加比赛的球队有 2 个关系?喜欢 team_a 和 team_b?
  • @mliebelt - 是的,它有 2 个关系:belongs_to :team_a, :class_name => 'Team', :foreign_key => 'team_a_id'(对于 :team_b 也是如此)

标签: ruby-on-rails ruby methods model


【解决方案1】:

您可以在Match 上定义一个私有方法,该方法委托给Team 上的方法(否则,它怎么知道在哪个团队上运行该方法?你说它是一个实例方法,并且我假设一场比赛有正在比赛的球队)。

after_save :update_teams_goals_sum
after_destroy :update_teams_goals_sum

private

def update_teams_goals_sum
  [team_a, team_b].each &:goals_sum
end

【讨论】:

  • 谢谢你,成功了。我还必须更正 team.rb 模型中“目标总和”定义的错误部分,因为它使用了错误的“除非”条件,导致 db 中的 :goal_count_cache 列无法更新。
【解决方案2】:
after_save :notify_team
after_destroy :notify_team

private

def notify_team
  Team.goals_sum
end

【讨论】:

  • 这不是调用 Team 的 instance 方法。
  • @Alex Lang - 这会给我这个错误:undefined method `goals_sum' for #<0xb6f61344>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多