2010-06-14 11 views
4

J'ai une relation has_many/belongs_to simple entre Report et Chart. Le problème que j'ai est que mon modèle Chart est un parent qui a des enfants.Rails héritage de l'objet avec belongs_to

Donc, dans mon modèle rapport que je

class Report < ActiveRecord::Base 
    has_many :charts 
end 

Et mon modèle graphique est un parent, où Pie, ligne, barre héritons tous de graphique. Je ne suis pas sûr d'où appartient le rapport belongs_to: dans le modèle de graphique, ou les enfants du modèle de graphique. Je reçois des erreurs lorsque je tente d'accéder chart.report parce que l'objet est de type « classe »

variable locale non définie ou méthode `rapport » pour # < Classe: 0x104974b90>

Le modèle graphique utilise STI pour que son pulling dise 'Gender' de la colonne chart_type dans la table des graphiques .. qu'est-ce qui me manque?

EDIT

 Chart 
    /\ 
    Pie Line 
    /\ 
/ \ 
Gender Sex 

Je suis (en utilisant STI) instanciation d'un objet de type genre, ou le sexe. J'espère que cela aide un peu plus.

J'ai le sentiment que son causé par

@chart.update_attributes(params[:chart]) 

parce que quand soumis son params fait [: graphique] ses params [: sexe] ou params [: sexe]

+0

1. Votre table de diagramme a-t-elle une colonne 'type'? 2. Vos classes Pie et Line héritent-elles de Chart? ('Pie

+0

1. Oui, chart_type, que je gère avec un getter dans le modèle. 2. Oui, Pie hérite de Chart. 3. Le genre et le sexe sont des modèles, puisqu'ils ont leurs propres calculs qu'ils utiliseraient sur les données. Chaque modèle, ou type de graphique, a une méthode pour calculer les valeurs, puis appelle super à afficher car ils affichent tous le même type de graphique (Pie) – Rabbott

Répondre

2

Votre problème est que vous avez un contrôleur qui reçoit tous ces différents types de modèles. Lorsque vous utilisez les aides de formulaire Rails, ils prennent le type d'objet de l'instance et l'utilisent pour remplir les paramètres. Cela signifie que vous avez params[:gender] au lieu de params[:chart]

Vous pouvez résoudre ce problème en remplaçant la méthode que Rails utilise pour générer le formulaire.Placez le code suivant dans votre classe graphique de base:

def self.model_name 
    name = "chart" 
    name.instance_eval do 
    def plural; pluralize; end 
    def singular; singularize; end 
    end 
    return name 
end 

Maintenant, toute classe qui est un enfant de graphique sera passé dans votre action de réception comme params[:chart]

Gardez à l'esprit que le changement du nom de l'objet que je 'ai décrit ci-dessus pourrait casser la fonctionnalité de certains plugins/gemmes qui en dépendent. Vous devriez envisager d'avoir plusieurs contrôleurs. Au lieu d'avoir un ChartsController pour recevoir toutes les données, avoir un GenderChartsController et un LineChartsController. Cela offre deux avantages:

  1. Vous n'avez pas besoin de changer le nom de l'objet
  2. Si vous avez besoin du code personnalisé pour un type spécifique de graphique à l'avenir, vous ne devez pas ajouter des instructions conditionnelles pour faire cela fonctionne, car les différents contrôleurs l'ont séparé pour vous.
1

Si tous les types de graphiques appartiennent à un rapport, puis placez

 
belongs_to :report 

dans le modèle parent (qui est graphique modèle dans votre cas je devine).

+0

Je reçois la même erreur, ai-je besoin d'autre chose dans le modèle Report? Quelque chose d'autre has_many: charts? – Rabbott

+0

appelez-vous Chart.report (cela donnerait une erreur de classe, c'est faux), vous pouvez seulement appeler cette méthode sur ce modèle de modèle objets –

+0

quelque chose comme "chart = Chart.find (: first)" et "chart.report" –

2

Vous devriez être en mesure d'utiliser juste

class Report < ActiveRecord::Base 
    has_many :charts 
end 

class Chart < ActiveRecord::Base 
    belongs_to :report 
end 

et appelez

@chart.report 
@pie.report 
@line.report 
@bar.report 
+0

Chose est l'objet @chart dans votre exemple serait en fait une instanciation d'un graphique à secteurs qui est un enfant de Chart. – Rabbott

+0

J'ai utilisé '@ chart' comme une instance de' Chart'. –

+0

droite, ce qui fonctionne bien pour moi. C'est quand j'essaie d'utiliser le genre, ou le sexe que cela devient un problème. En utilisant STI pour une raison quelconque, l'objet semble être de type "Class" – Rabbott

0

a besoin de votre colonne chart_type à renommer juste type, à moins que vous explicitement réenregistrés Base.inheritance_column.

Avez-vous renommé explicitement la colonne d'héritage de table unique en chart_type?

+0

J'ai ce qui suit dans mon modèle de graphique "set_inheritance_column: chart_type" – Rabbott

+0

Cela écraserait aussi. Hrm ... – nfm

Questions connexes