【问题标题】:Is it bad design to have two models with many-to-many relationships also belong to the same parent?有两个具有多对多关系的模型也属于同一个父级是不好的设计吗?
【发布时间】:2016-03-07 14:19:31
【问题描述】:

我正在编写一个包含 Players、Frames 和 Throws 的保龄球应用程序。球员有框架和投掷。一个 Frame 有多个 Throw。并且一个Throw可以关联多个Frame(例如,当一个frame投出一记好球时,需要使用后续的throw在这个frame中进行计分)。

我的模型如下所示:

class Player < ActiveRecord::Base
  has_many :frames
  has_many :throws
end

class Frame < ActiveRecord::Base
  belongs_to :player
  has_and_belongs_to_many :throws
end

class Throw < ActiveRecord::Base
  belongs_to :player
  has_and_belongs_to_many :frames
end

将三者都这样关联是不是糟糕的设计?我应该考虑不同的架构吗?

【问题讨论】:

  • 我可能对语义感到困惑,但 throw 真的有很多帧吗?
  • 一次投掷可以与许多帧相关联。例如,第一帧可能是罢工。然后第 2 帧的投掷也将与第 1 帧相关联,因为第 1 帧需要知道它才能计算第 1 帧的得分。基本上,帧需要知道未来帧的投掷。
  • 出于个人/组织偏好,我可能会给它一个游戏的背景。那么一次投掷不需要很多帧……您可以通过访问上一帧来引用最后一次投掷。
  • 我其实也有一个游戏。一个游戏有很多玩家。 Throw 仍然需要与多个 Frame 关联,以便 Frame 知道如何为自己评分。现在我想知道我是否可以让框架引用其他框架。然后它可以预测同一玩家的未来帧并计算自己的得分,而无需关联投掷。

标签: ruby-on-rails postgresql rails-activerecord


【解决方案1】:

我认为您可以使用更简单的结构来满足您的要求。使用以下结构,您可以跟踪每个球员的每一帧和每一帧的投掷。

class Player < ActiveRecord::Base
  has_many :frames
end

class Frame < ActiveRecord::Base
  belongs_to :player
  has_many :throws
end

class Throw < ActiveRecord::Base
  belongs_to :frame
end

或者,如果您需要单独跟踪特定球员的投球和投篮,并且还需要帧和投篮之间的 has_many 关联。你可以这样做:

class Frame < ActiveRecord::Base
  has_many :throws, through: :players
end

class Player < ActiveRecord::Base
  belongs_to :frame
  belongs_to :throw
end

class Throw < ActiveRecord::Base
  has_many :frames, through: :players
end

【讨论】:

    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2011-01-22
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多