我正在尝试在 Ruby on Rails 中设计一个成就系统,但我的设计/代码遇到了障碍。
尝试使用多态关联:
class Achievement < ActiveRecord::Base
belongs_to :achievable, :polymorphic => true
end
class WeightAchievement < ActiveRecord::Base
has_one :achievement, :as => :achievable
end
迁移:
class CreateAchievements < ActiveRecord::Migration
... #code
create_table :achievements do |t|
t.string :name
t.text :description
t.references :achievable, :polymorphic => true
t.timestamps
end
create_table :weight_achievements do |t|
t.integer :weight_required
t.references :exercises, :null => false
t.timestamps
end
... #code
end
然后,当我尝试以下一次性单元测试时,它失败了,因为它说成就为空。
test "parent achievement exists" do
weightAchievement = WeightAchievement.find(1)
achievement = weightAchievement.achievement
assert_not_nil achievement
assert_equal 500, weightAchievement.weight_required
assert_equal achievement.name, "Brick House Baby!"
assert_equal achievement.description, "Squat 500 lbs"
end
还有我的固定装置:results.yml...
BrickHouse:
id: 1
name: Brick House
description: Squat 500 lbs
achievable: BrickHouseCriteria (WeightAchievement)
weight_achievements.ym...
BrickHouseCriteria:
id: 1
weight_required: 500
exercises_id: 1
即使,我无法让它运行,也许从宏观的角度来看,这是一个糟糕的设计问题。我试图做的是有一个包含所有成就及其基本信息(名称和描述)的表。使用该表和多态关联,我想链接到包含完成该成就的标准的其他表,例如,WeightAchievement 表将具有所需的权重和锻炼 ID。然后,用户的进度将存储在 UserProgress 模型中,在该模型中链接到实际的成就(而不是 WeightAchievement)。
我需要单独表格中的标准的原因是因为标准在不同类型的成就之间会有很大差异,并且会在之后动态添加,这就是为什么我没有为每个成就创建单独的模型的原因。
这甚至有意义吗?我是否应该将成就表与特定类型的成就(如 WeightAchievement)合并(所以该表是名称、描述、weight_required、exact_id),然后当用户查询成就时,我只需在我的代码中搜索所有成就?(例如 WeightAchievement、EnduranceAchievement、RepAchievement 等)