gpt4 book ai didi

ruby-on-rails - 有人可以帮我这个协会吗?

转载 作者:行者123 更新时间:2023-12-04 05:51:51 25 4
gpt4 key购买 nike

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

现在我可以很好地为用户添加/删除 Pawns,我的模型如下所示:

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

class Pawn < ActiveRecord::Base
belongs_to :user

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

我很难思考应该如何设置挑战。我的想法是每个 Pawn 都会有一个 self 引用的多对多关系,几乎就像建立友谊关系一样。但是,我不知道是否应该考虑与用户或 Pawn 相关的挑战。

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

编辑:

这是我要完成的工作的图表。我绝对认为我需要某种关联设置。结果将保存该挑战的 Pawn 的统计信息(例如 time_spent、clicks_made 等)。 Challenge 也会有一列获胜者或类似的东西。

enter image description here

最佳答案

您的挑战可能为每种类型的 pawn 定义了关联。

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

Pawn 将与每种类型的挑战相关联。

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

您的用户可以与 pawn 和通过 pawn 进行的挑战相关联。获得与用户关联的两种挑战类型的一种简单方法是将两种挑战关联(发起和接收)的结果组合到一个方法#challenge 中。

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_id 反规范化为 :challengee_user_id 和 :challenger_user_id... 或缓存用户的挑战 ID 列表,以便您进行一次查询而不是两次查询。

关于ruby-on-rails - 有人可以帮我这个协会吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12443304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com