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
次に、この次の使い捨て単体テストを試すと、実績が null であると表示されて失敗します。
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 のような特定の種類のアチーブメント (したがって、テーブルは name、description、weight_required、exercise_id) とマージする必要があります。その後、ユーザーがアチーブメントを照会すると、コードですべてのアチーブメントを検索するだけですか? (例: WeightAchievement、EnduranceAchievement、RepAchievement など)