Sto tentando di progettare un sistema di risultati in Ruby on Rails e ho avuto un problema con il mio design/codice.RoR Achievement System - Polymorphic Association & Design Issues
Il tentativo di utilizzare associazioni polimorfiche:
class Achievement < ActiveRecord::Base
belongs_to :achievable, :polymorphic => true
end
class WeightAchievement < ActiveRecord::Base
has_one :achievement, :as => :achievable
end
Migrazioni:
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
Poi, quando provo questa seguente test di unità e getta, non riesce perché si dice che il risultato è nullo.
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
E i miei infissi: 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
Anche se, non posso ottenere questo per funzionare, forse nel grande schema delle cose, è un pessimo problema di design. Quello che sto tentando di fare è avere un'unica tabella con tutti i risultati e le loro informazioni di base (nome e descrizione). Usando quella tabella e le associazioni polimorfiche, voglio collegarmi ad altre tabelle che conterranno i criteri per completare quel risultato, ad es. la tabella WeightAchievement avrà il peso richiesto e l'esercizio id. Quindi, il progresso di un utente verrà memorizzato in un modello UserProgress, in cui si collega all'effettivo Obiettivo (al contrario di WeightAchievement).
Il motivo per cui ho bisogno dei criteri in tabelle separate è perché i criteri varieranno selvaggiamente tra i diversi tipi di risultati e verranno aggiunti dinamicamente in seguito, motivo per cui non sto creando un modello separato per ogni risultato.
Questo ha senso? Dovrei semplicemente unire la tabella Achievement con il tipo specifico di raggiungimento come WeightAchievement (quindi la tabella è name, description, weight_required, exercise_id), quindi quando un utente interroga i risultati, nel mio codice cerco semplicemente tutti i risultati? (ad esempio, WeightAchievement, EnduranceAchievement, RepAchievement, ecc.)
Grazie - essenzialmente ciò che stavo cercando ma non riuscivo a capirmi. – MunkiPhD