2009-04-18 10 views
18

this articleに記載されているように、私はフィクスチャに自動アソシエーションを使用しています。たとえば、地域オブジェクトに国IDがある場合、「country_id」を実行する代わりに:1、「country」:「USA」を実行します。 "USA"はcountries.ymlファイル内のラベルなので、備品はこれをどう扱うかを知っています。ただし、これは、countriesオブジェクトのID値を指定しない場合にのみ機能します。だから私はUSAのIDを1にすることはできません。しかし、私はそれを1に指定しなければ、いくらか大きな値8974343になります。これはちょっと変です。スーパーハイではないIDを自動的に生成するための備品を入手する方法はありますか? ....これは大丈夫ですか?ruby​​ on rails fixturesの自動アソシエーション

答えて

21

APIドキュメントを読むと、これは自動生成されたフィクスチャが正しく動作すると思われます。フィクスチャの特定のID値をあらかじめ指定したい場合は、自分で割り当てる必要があります。

ない場合は、よく、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

なぜ人々は答えを受け入れるが、投票しないと思いますか? –

3

治具のidは、我々限り、それは我々が何をロードせずに任意のフィクスチャのIDを発見することができますか」だ(その名をハッシュから直接来ますラベルを知る ")

23

これは、フィクスチャラベルの自動生成されたIDを取得する方法です。

Fixtures.identify(:reginald) 
+11

このSOの記事が私を大いに助けてくれたので、私はRails 4.1.0.rc1のアップデートを提供したいと思います:<%= ActiveRecord :: FixtureSet.identify(:reginald)%> – Chris

+0

ラベルが参照されます。 http://ruby-journal.com/rails/define-fixtures-with-polymorphic-association/ – Shadoath

1

自動テストへ治具の完全性を強化する

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 
関連する問題