2012-05-14 14 views
16

que tienen los siguientes modelos:¿Cómo configuro mis accesorios para una relación has_and_belongs_to_many?

class Company < ActiveRecord::Base 
    has_and_belongs_to_many :regions 

class Region < ActiveRecord::Base 
    has_many :requests 
    has_and_belongs_to_many :companies 

class RequestForProposals < ActiveRecord::Base 
    belongs_to :region 

En cuanto tenga una nueva solicitud, quiero enviar una notificación a las empresas que operan en la misma región.

¿Cómo configuro esto en mis accesorios para que pueda probar la lógica de encontrar las compañías adecuadas?

He intentado

region_ids: 1, 2 
regions: one, two 

en companies.yml, pero ni las obras en la asignación de las regiones a las empresas.

Aquí es una esencia del SQL generado: https://gist.github.com/2713518

Respuesta

28

Para

regions: one, two 

en companies.yml para trabajar es necesario dejar que los carriles de auto asignar los identificadores para las regiones. Esto se debe a que (para evitar tener que leer regions.yml before companies.yml) rails calcula los identificadores que pega en la tabla de unión a partir de los nombres de los accesorios de la empresa. si ha asignado los identificadores usted mismo, no coincidirán con los calculados.

Desde el sql que nos ha facilitado Parece que está configurando los identificadores en las regiones 1 y 2, es decir, su regions.yml ha

one: 
    id: 1 
    name: MyString 

Retire la id:1 y que debe estar bien. Usted también necesita actualizar cualquier otro archivo (por ejemplo request_for_proposals.yml) que se refieren a las regiones, en sustitución de

region_id: 1 

con

region: one 

rieles sabrá que eso significa para establecer region_id a la identificación de la región con etiqueta one en sus accesorios.

0

estoy seguro de cómo lo hace un uso accesorios YAML en estos días. ¿Has probado FactoryGirl para crear instancias de objetos db durante las pruebas? Sin embargo, hace más o menos lo mismo que los accesorios, de una manera muy sofisticada.

En los siguientes pasajes se presupone que está utilizando rspec como marco de prueba.

Después de incluir en su factory_girl-railsGemfile y actualizar en consecuencia spec/spec_helper.rb a la factory_girl s README, crear los siguientes archivos:

# spec/factories/company_factories.rb 
FactoryGirl.define do 
    factory :company do 
    title { |n| "Test Company #{n}" } 

    # whatever else fields 

    after_create { |company| company.regions << FactoryGirl.create(:region) } 
    end 
end 

# spec/factories/region_factories.rb 
FactoryGirl.define do 
    factory :region do 
    # whatever fields here 
    end 
end 

# spec/factories/request_factories.rb 
FactoryGirl.define do 
    factory :request do   
    # whatever fields here 
    end 
end 

Ahora la verdadera pregunta es - ¿cuál es el código de prueba real que está haciendo?

0

¿Está su directory.yml en el directorio de prueba/fijaciones? ¿Qué hay de las empresas.yml? El código "regiones: uno, dos" para una empresa determinada debería funcionar.
Rails carga automáticamente las luminarias en este directorio cuando ejecuta la prueba. Si las ubicaciones son correctas, publique la salida de prueba - sql generado - cuando ejecuta las pruebas.

+0

Aquí hay una esencia del SQL generado: https: //gist.github .com/2713518 –

+0

Y sí, los archivos de accesorios están en el directorio de prueba/accesorios –

-1

Además de la respuesta aceptada, si tiene que calcular dicha identificación usted mismo, p. usted tiene algunas referencias sueltas u otra fuente de datos sólo tiene que añadir:

def fixh(key) 
    ActiveRecord::FixtureSet.identify key 
end 

a su test_helper.rb y luego utiliza de esta manera en los accesorios:

security_context1: 
    ext_id: <%= fixh :user1 %> 
Cuestiones relacionadas