我正在尝试设置一个类似游戏的Rails应用。该应用程序具有用户,每个用户都有可以创建的Pawn。用户可以搜索其他用户和他们创建的Pawn,并可以使用自己的Pawn挑战另一个用户。被挑战的用户然后可以接受/拒绝挑战。

现在,我可以为用户添加/删除Pawn,并且我的模型如下所示:

class User < ActiveRecord::Base
  has_many :pawns, dependent: :destroy




class Pawn < ActiveRecord::Base
  belongs_to :user


现在,如果User1要挑战User2创建的Pawn,他将查看User2的Pawn列表,然后单击所需的Pawn的“挑战”按钮。然后,User1必须选择他的一个Pawn用于挑战,然后单击Save。现在,User2需要接受/拒绝挑战。

我很难理解如何应对挑战。我的想法是,每个Pawn都将具有自我参照的多对多关系,就像建立友谊关系一样。但是,我不知道是否应该考虑与用户或典当相关的挑战。

建模这样的最佳方法是什么?

编辑:

这是我要完成的工作的图表。我definitley认为我需要某种关联设置。结果将保存该挑战的该Pawn的统计信息(例如time_spent,clicks_made等)。挑战也将有一个专为获胜者或类似对象提供的专栏。

最佳答案

您的挑战可能为每种典当定义了关联。

class Challenge < ActiveRecord::Base
  # attributes :challengee_id, :challenger_id

  belongs_to :challengee, class_name: "Pawn"
  belongs_to :challenger, class_name: "Pawn"

  has_many :results
end


典当对于每种类型的挑战都有关联。

class Pawn < ActiveRecord::Base
  # attributes :user_id

  belongs_to :user

  has_many :results
  has_many :initiated_challenges, class_name: "Challenge", foreign_key: :challenger_id
  has_many :received_challenges, class_name: "Challenge", foreign_key: :challengee_id
end


为结果记录非常规化Challenge_id可能是可以的。

class Result < ActiveRecord::Base
  # attributes: pawn_id, challenge_id, :result
  belongs_to :pawn
  belongs_to :challenge
end


您的用户可以与棋子和通过棋子的挑战相关联。获取与用户关联的两种挑战类型的一种简单方法是将两个挑战关联(发起和接收)的结果合并为一种方法#挑战。

class User < ActiveRecord::Base
  has_many :pawns
  has_many :initiated_challenges, through: :pawns, source: :initiated_challenges
  has_many :received_challenges, through: :pawns, source: :received_challenges

  def challenges
    initiated_challenges + received_challenges
  end
end


此方法的性能优化可以包括:将对挑战的user_ids规范化为:challengee_user_id和:challenger_user_id ...或在用户上缓存挑战ID列表,以便您进行一次查询而不是两次查询。

10-08 06:23