【问题标题】:has_one and has_manyhas_one 和 has_many
【发布时间】:2012-11-25 20:22:32
【问题描述】:

我有一个Team 对象和一个Game 对象。

Game 应该有一个获胜者,即Team 一个Team可以成为多个Games的赢家

我怎样才能正确地构造它?我正在使用 Mongoid

这是我到目前为止想出的......

class Game
  include Mongoid::Document
  include Mongoid::Timestamps
  has_one :winner, :class_name=>Team
end

class Team
  include Mongoid::Document
  include Mongoid::Timestamps
  has_and_belongs_to_many :games_won, :class_name=>"Game", :inverse_of => :Game 
end

【问题讨论】:

    标签: ruby-on-rails ruby activerecord associations mongoid


    【解决方案1】:

    考虑将 win 抽象到它自己的类中,这样:

    class Game
      has_one :win
    end
    
    class Team
      has_many :wins
    end
    
    class Win
      belongs_to :game
      belongs_to :team
    end
    

    这使结构更合乎逻辑,使代码更简单,并且在您可能出于其他原因希望将 win 作为单独资源开始使用的情况下具有其他优势。

    【讨论】:

    • 好主意。刚试过这个。将获胜更改为结果。但我得到了 Result:Class 的未定义方法“has_a”。应该改为 has_one 吗?
    • 抱歉,应该是has_one。我不假思索地打字:)
    • 没问题,虽然我得到了一些奇怪的东西......“当向 Result#game 添加一个(n)游戏时,Mongoid 无法确定要设置的反向外键。尝试的键是'结果_id'。”这是我尝试执行结果 = Result.new,然后是 result.game = Game.find(....
    • Result 类上使用belongs_to 方法,并确保结果表包含game_idteam_id 的列。我的原始代码在Result 类上也有has_one,这使得Rails 在games 表上查找外键。 has_onebelongs_to here 之间的区别有一个很好的解释。
    • 太棒了,看起来它现在正在工作..(无法访问 MyGame.result 时遇到问题。但我重新启动了 rails,现在看起来没问题)。只是为了确保......当我查看 Game 的 mongo 文档时,我注意到它没有对 Result 的引用(但 Result 对 Game 的引用)。为了效率起见(因为看起来做 game.result 可能会产生一堆查询),有没有办法在 Game 中保留对所有结果的引用?
    猜你喜欢
    • 2018-04-08
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多