我正在尝试设置一个类似游戏的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列表,以便您进行一次查询而不是两次查询。