Я пытаюсь создать систему достижений в Ruby on Rails и столкнулся с проблемой с моим дизайном/кодом.Система достижений RoR - Полиморфная ассоциация и проблемы дизайна
Попытки использования полиморфных ассоциаций:
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
И мои светильники: achievements.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 будет иметь требуемый вес и идентификатор упражнения. Затем прогресс пользователя будет сохранен в модели UserProgress, где он привязывается к фактическому достижению (в отличие от WeightAchievement).
Причина, по которой мне нужны критерии в отдельных таблицах, заключается в том, что критерии будут разнятся между различными типами достижений и будут добавлены динамически после этого, поэтому я не создаю отдельную модель для каждого достижения.
Имеет ли это смысл? Должен ли я просто слить таблицу достижений с конкретным типом достижения, например WeightAchievement (так что таблица - это имя, описание, weight_required, exercise_id), а затем, когда пользователь запрашивает достижения, в моем коде я просто ищу все достижения? (например, WeightAchievement, EnduranceAchievement, RepAchievement и т. д.)
Спасибо - это, по сути, то, что я искал, но не мог окутать мою голову. – MunkiPhD