Ruby on Rails에서 업적 시스템을 설계하려고 시도 중이고 내 디자인/코드로 인해 문제가 발생했습니다. 다형성 연결을 사용하려고 RoR Achievement System - 다형성 연관 및 디자인 문제
: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 테이블에는 필요한 가중치와 운동 ID가 있습니다. 그런 다음 사용자 진행률이 UserProgress 모델에 저장되며 실제 진행률 (WeightAchievement와 반대)으로 연결됩니다.
기준이 다른 테이블에서 기준을 필요로하는 이유는 다양한 업적 유형간에 기준이 크게 달라질 수 있으며 나중에 동적으로 추가되므로 각 업적에 대해 별도의 모델을 만들지 않기 때문입니다.
이 말이 맞습니까? 나는 성취도 테이블을 WeightAchievement와 같은 특정 유형의 성취도와 병합해야합니까 (테이블이 이름, 설명, weight_required, exercise_id). 그러면 사용자가 업적을 쿼리하면 코드에서 모든 업적을 간단히 검색합니까? (예 : WeightAchievement, EnduranceAchievement, RepAchievement 등)
감사합니다 - 본질적으로 내가 찾고 있었지만 머리를 감쌀 수 없었습니다. – MunkiPhD