2010-10-11 9 views
5

Estoy trabajando en mi primera aplicación Rails (3) y estoy buscando sembrar una gran cantidad de datos.¿Cómo sembrar modelos con relaciones HABTM con otros modelos sin semilla?

El problema que estoy teniendo es que quiero sembrar algunos modelos que tienen una relación has_and_belongs_to_many con otros modelos que acabo de sembrar. Estoy haciendo lo que parece correcto, pero no estoy obteniendo los resultados que esperaba.

que tienen un modelo de Asana (simplificado):

class Asana < ActiveRecord::Base 
    has_and_belongs_to_many :therapeutic_foci 
end 

y el modelo TherapeuticFocus:

class TherapeuticFocus < ActiveRecord::Base 
    has_and_belongs_to_many :asanas 
end 

En mi db/seeds.rb, que crear algún TherapeuticFoci:

tf = TherapeuticFocus.create([ 
    {:name => 'Anxiety'}, 
    {:name => 'Asthma'}, 
    {:name => 'Fatigue'}, 
    {:name => 'Flat Feet'}, 
    {:name => 'Headache'}, 
    {:name => 'High Blood Pressure'}, 
    {:name => 'Stress'} ]) 

A continuación, cree una Asana:

asanaCreate = Asana.create!([ 
    { :english_name => 'Mountain Pose', 
    :traditional_name => 'Tadasana', 
    :pronunciation => 'TadaSANA', 
    :deck_set => 'Basic', 
    :type => 'Standing', 
    :therapeutic_foci => TherapeuticFocus.where("name in ('Stress','Flat Feet')")} 
]) 

El resultado es que se crean los modelos TherapeuticFocus, se crea el Asana, pero no crea las relaciones con los modelos TherapeuticFocus. La matriz resultante está vacía.

Si me quedo

TherapeuticFocus.where("name in ('Stress','Flat Feet')") 

en la consola de rieles, consigo los esperados dos registros:

irb(main):010:0> TherapeuticFocus.where("name in ('Stress','Flat Feet')") 
=> [#<TherapeuticFocus id: 6, name: "Flat Feet", description: nil, created_at: "2010-10-11  01:48:02", updated_at: "2010-10-11 01:48:02">, 
    #<TherapeuticFocus id: 19, name: "Stress",  description: nil, created_at: "2010-10-11 01:48:02", updated_at: "2010-10-11 01:48:02">] 

Así que, ¿cómo se hace esto?

¿O existe una forma mejor de hacerlo?

Gracias!

RESPUESTA POST:

que ya había añadido la inflexión:

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.irregular 'focus', 'foci' 
end 

Mi migración de las tablas de combinación que parece:

create_table :asanas_therapeutic_foci, :id => false do |t| 
    t.references :asana, :therapeutic_focus 
end 

Voy a tratar de cambiar esto a t. belongs_to en lugar de t.references y ver si eso funciona.

Respuesta

5

¿Ha registrado la pluralización de "foco"? No se define por defecto, por lo que tendrá que definirlo (por lo general en config/initializers/inflections.rb):

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.irregular 'focus', 'foci' 
end 

También es necesario asegurarse de que su migración se ha definido la correcta tabla de unión para la asociación HABTM. Aquí está la parte pertinente de la migración "ascendente" que utilicé:

create_table :asanas do |t| 
     t.string :english_name 
     t.string :traditional_name 
     t.string :pronunciation 
     t.string :deck_set 
     t.string :type 
    end 
    create_table :therapeutic_foci do |t| 
     t.string :name 
    end 
    create_table :asanas_therapeutic_foci, :id => false do |t| 
     t.belongs_to :asana 
     t.belongs_to :therapeutic_focus 
    end 

Utilicé los modelos como los citó.

Con esos bits en su lugar, pude cargar sus definiciones de inicialización.

+0

Aha, lo descubrí, me di cuenta de que puedo ver el desarrollo.log durante un rake db: setup, y vi que mi problema se derivaba del atributo ": therapeutic_foci" que no podía asignarse en masa. Arreglando eso, todo funciona. ¡Gracias! –

Cuestiones relacionadas