2010-07-13 19 views
0

J'ai beaucoup de données que j'essaye de semer dans un modèle polymorphe dans Rails 2.3.8. L'association pour toutes les données est avec le modèle du comté. Les données ressemble à:Ruby on Rails: Comment graine-t-on la colonne * _type dans les modèles polymorphes?

data = Datum.create([ 
    ... 
    { :value => '14389', :value_type => County, :value_id =>'3103'}, 
    { :value => '59013', :value_type => County, :value_id =>'3105'}, 
    { :value => '17117', :value_type => County, :value_id =>'3106'}, 
    ... 
]) 

Le: value_type => Les valeurs du comté conduisent à « méthode non définie BASE_CLASS' pour cordes: classe. »

J'ai des dizaines de milliers de ces valeurs que je voudrais semer dans la base de données. Ils sont similaires aux valeurs ci-dessus, sauf certains sont associés au modèle du comté, certains avec le modèle d'État, et d'autres avec le modèle de la ville. Ce sont des valeurs statiques qui ne seront pas éditées après l'introduction dans la base de données.

Comment puis-je graver le modèle dans le champ: type_valeur?

(ou ... suis-je aborder ce mal et si oui, comment voulez-vous aborder?)

Edit: La partie pertinente du fichier schema.rb:

Isaac -

create_table "data", :force => true do |t| 
    t.integer "value" 
    t.string "value_type" 
    t.integer "value_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

create_table "counties", :force => true do |t| 
    t.string "name" 
    t.integer "state_id" 
    t.integer "ansi_code" 
    t.string "ansi_class" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

J'ai essayé ce qui suit sur l'ensemencement, aussi, et cela n'a pas fonctionné (County guillemets):

{ :value => '14389', :value_type => 'County', :value_id =>'3103'}, 
+0

Pouvez-vous publier les parties pertinentes de votre schéma.rb? –

+3

Avoir 'value',' value_type' et 'value_id' n'a pas de sens. Le modèle Datum utiliserait 'value_type' et' value_id' pour aller trouver l'enregistrement correct dans une autre table quand on y accède avec quelque chose comme 'somedatum.value' –

+0

Jamie - J'ai suivi l'exemple d'Obie" The Rails Way "p. 215 où, dans un modèle Commentaire, il existe des champs 'subject',' subject_id', et 'subject_type'. Le modèle Comment inclut 'belongs_to: subject,: polymorphic => true' et les autres classes ont' has_many: comments,: as =>: subject'. Mon modèle de référence incluait la ligne 'belongs_to: value,: polymorphic => true'. Le modèle My County comprenait la ligne 'has_many: data,: as =>: value'. – Clay

Répondre

2

Vous certainement ne pas besoin de la colonne « valeur » dans votre schéma - juste « value_id » et « value_type ». Ensuite, vos données de semences devraient ressembler à ceci:

... 
{ :value_id => 12345, :value_type => "County" }, 
... 

Notez que « le comté » est une chaîne entre guillemets.

Une autre alternative serait de le faire:

{ :value => County.find(12345) } 

Et puis Rails définira automatiquement les colonnes :value_type et :value_id pour vous en fonction du nom de classe et id du dossier County. Cet exemple pourrait vous donner une meilleure idée de ce qui se passe. Cependant, pour des milliers d'enregistrements, cela serait beaucoup plus lent, donc la première approche est probablement meilleure pour ce cas.

+0

C'est certainement vrai, mais ce qui ne me paraît pas clair, c'est ce que l'OP essaie de faire avec:: value_id => '3103'' –

+0

Basé sur le Le schéma d'OP, j'espère et en supposant qu'il a un dossier de comté avec l'ID 3103. Pour que cela fonctionne, le comté (et d'autres tables de valeurs potentielles, par exemple, ville, région) devrait être prérempli avec des enregistrements avec ceux ids. Si ce n'est pas le cas, alors plus de code est nécessaire (quelque chose comme ': value => County.new ([d'autres attributs de comté ici])' pourrait fonctionner). –

+0

Nick a raison. Désolé pour la confusion avec le nom. le ': value' est un nombre de population. ': value_type' fait référence à l'autre modèle dans la relation polymorphe - dans ce cas, County. ': valeur_id' est le numéro d'identification du comté (pré-rempli). – Clay

1

Cela se produit parce que vous avez fait dans votre modèle:

belongs_to :value, :polymorphic => true 

Et parce que vous essayez de définir la colonne de valeur sur la table aussi. Rails ne sera pas en mesure de faire la différence entre vous définissant l'association ou la colonne via cette méthode. Pour définir l'utilisation de la colonne suivante:

self[:value] = "something"