18 votes

Associations automatiques dans les montages ruby on rails

Comme décrit dans cet article J'utilise des associations automatiques dans les montages. Par exemple, si un objet région a un id de pays, au lieu de faire "country_id" : 1, je fais "country" : "USA". "USA" est un label dans mon fichier countries.yml, donc les fixtures savent comment s'en occuper. Cependant, cela ne fonctionne que lorsque vous ne spécifiez pas de valeur d'ID pour l'objet countries. Je ne peux donc pas attribuer la valeur 1 à l'ID des États-Unis. Mais si je ne lui attribue pas la valeur 1, il finit par être une grande valeur 8974343... ce qui est assez étrange. Existe-t-il un moyen de faire en sorte que les appareils génèrent automatiquement des identifiants qui ne soient pas trop élevés ? .... ou est-ce que cela est acceptable ?

24voto

crazycrv Points 161

C'est ainsi que vous obtenez un identifiant autogénéré de l'étiquette de l'appareil.

Fixtures.identify(:reginald)

22voto

Don Werve Points 3901

En lisant la documentation de l'API, on constate que c'est exactement comme ça que les appareils générés automatiquement sont censés se comporter. Si vous voulez avoir une valeur d'identification spécifique pour un appareil à l'avance, vous devriez probablement l'attribuer vous-même.

Sinon, consultez les documents de l'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.

17voto

Edo Points 38

Comme je n'ai pas assez de réputation pour faire des commentaires, voici la documentation actuelle de Rails 4.1 :

http://edgeapi.rubyonrails.org/classes/ActiveRecord/FixtureSet.html#class-ActiveRecord::FixtureSet-label-Fixture+label+interpolation

Sous Interpolation des étiquettes des appareils :

monkey_id: <%= ActiveRecord::FixtureSet.identify(:reginald) %>
pirate_id: <%= ActiveRecord::FixtureSet.identify(:george) %>

3voto

L'identifiant de l'appareil provient directement du hachage de son nom (c'est ainsi que "nous pouvons découvrir l'identifiant de n'importe quel appareil sans avoir à charger quoi que ce soit, pour autant que nous connaissions l'étiquette").

1voto

grosser Points 4300

Test automatisé pour assurer l'intégrité des montages

  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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X