2009-04-18 14 views
18

Como se describe en this article, estoy usando asociaciones automáticas en los dispositivos. Por ejemplo, si un objeto de región tiene una identificación de país, en lugar de hacer "country_id": 1, hago "country": "USA". "USA" es una etiqueta en mi archivo countries.yml, por lo que Fixtures sabe cómo encargarse de esto. Sin embargo, esto solo funciona cuando no especifica un valor de ID para el objeto de países. Así que no puedo asignar el ID de EE. UU. A 1. Pero si no lo asigno a ser 1, termina siendo un gran valor 8974343 ... que es un poco extraño. ¿Hay alguna manera de obtener accesorios para generar automáticamente identificadores que no sean súper altos? .... ¿o está bien?Asociaciones automáticas en ruby ​​on rails fixtures

Respuesta

21

Al leer la documentación de la API, así es exactamente como se supone que se comportan los dispositivos autogenerados: si desea tener un valor de ID específico para un dispositivo por adelantado, probablemente debería asignarlo usted mismo.

Si no, bueno, a partir de los documentos de la API:

The generated ID for a given label is constant, so we can discover any fixture‘s ID without loading anything, as long as we know the label. 
+0

¿Por qué crees que las personas aceptan respuestas pero no las votan? –

3

Identificación del accesorio viene directamente de hash su nombre (que es como "podemos descubrir Identificación de cualquier accesorio sin cargar nada, siempre y cuando saber la etiqueta ")

23

Así es como se obtiene una identificación autogenerada de la etiqueta del accesorio.

Fixtures.identify(:reginald) 
+11

Como este artículo SO me ayudó mucho, me gustaría dar una actualización para Rails 4.1.0.rc1: <% = ActiveRecord :: FixtureSet.identify (: reginald)%> – Chris

+0

Tuve que incluir la clase que el etiqueta a la que se hace referencia. http://ruby-journal.com/rails/define-fixtures-with-polymorphic-association/ – Shadoath

1

prueba automatizada de imponer la integridad del dispositivo

class FixtureIntegrityTest < ActiveSupport::TestCase 
    context "fixture integrity" do 
     should "work" do 
     fixtures = Dir["test/fixtures/*.yml"].map do |file| 
      [file, File.basename(file).sub(/\..*/, "").singularize, YAML.load(ERB.new(File.read(file)).result)] 
     end 

     failures = fixtures.reject(&:last).map { |file,*| "#{file} is empty!"} 

     failures = failures.presence || fixtures.map do |_, klass, content| 
      content.select{ |_,fixture| fixture["id"] }.map do |name, _| 
      fixtures.map do |file, _, content| 
       content.select { |_,fixture| fixture[klass] == name }.map do |_, fixture| 
       "#{file} uses #{klass}: #{name}, but should use the id!" 
       end 
      end 
      end 
     end.flatten.compact 

     assert_equal [], failures 
     end 
    end 
    end