2012-02-26 17 views
0

私はこれがモデル協会(has_manyの:経由)レール持って自分のアプリケーションにFactoryGirlでこのモデル関連付けを行う方法は?

class User < ActiveRecord::Base 
    has_many :assignments 
    has_many :roles, :through => :assignments 
end 

class Assignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
end 

class Role < ActiveRecord::Base 
    has_many :assignments 
    has_many :users, :through => :assignments 
end 

私は(今のところ)3つの役割を持っているが、それぞれの役割:名前は一意です。したがって、ロールデータベースには、今、ユーザ、管理者、モデレータの3つのエントリが含まれています。

ユーザ、管理者、モデレータ、およびその役割を作成できるように工場を作成するにはどうすればよいですか?

私のような何かをするのが大好きだ:

(役割:名前は一意性のためにチェックされているので、ユーザーごとに1つのロールエントリを作成しないでください、それは代わりに、ユーザーごとの役割に1つの割り当てを作成する必要があります。 )

# Create my roles 
FactoryGirl.create(:role, :name => 'admin') 
FactoryGirl.create(:role, :name => 'user') 
FactoryGirl.create(:role, :name => 'moderator') 

# Create 10 users and 10 moderators assuming that the username is sequential or something 
for i in 0..10 
    user = FactoryGirl.create(:user) # user.roles.first.name.eql? 'user' #should be true 
    mod = FactoryGirl.create(:moderator) # mod.roles.first.name.eql? 'moderator' #should be true 
end 

FactoryGirlとこの関連付けをモデル化するファクトリをどのように作成しますか?

答えて

2

私はこの問題についてJosh Clayton(ファクトリー・ガールのメンテナ)に連絡、彼は次のように返答するようなものだった:

一意性制約がありますこれはあなたを得るでしょう - 悲しいことに、あなたはループ外で役割を作り、名前を付けてそれらの名前を再利用しなければなりません。ハックする方法は他にもあるかもしれませんが、もしあなたがそれについてどうやったらどうやって行くのかは本当に分かりません。

だから、最後に私のような何かをすることによって、問題を解決:ちょうど「割り当て」中間テーブルを忘れ

 user_role = FactoryGirl.create(:role, :title => 'user') 

    for i in (1..10) do 
     user = FactoryGirl.create(:user) 
     user.roles << user_role 
    end 

0
FactoryGirl.define do 
    factory :user do 
    col1 { Forgery(basic).col1_datatype } 
    end 
    factory :role do 
    another_attribute { Forgery(basic).another_attr_datatype } 
    end 
    factory :assignment do 
    user 
    role 
    end 
end 

カップルの事

  1. は、検証を満たす助けユーザーとロールのブロック内の任意の列を追加することを確認します。
  2. 外部キー以外の属性がある場合は、同じことが割り当てブロックになります。

テストでは、2つの方法があります。

ウェイ1(オートマジック)

@assign = FactoryGirl.create(:assign) 

ウェイ2(厳密に制御)

@user = FactoryGirl.create(:user) 
@role = FactoryGirl.create(:role) 
@assign = FactoryGirl.create(:assign, user: @user, role: @role) 

は、常にドキュメントがあります。

+0

あなたが私に言ったらどういう意味ですか?「バリデーションを満たすのに役立つユーザーブロックとロールブロック内に列を追加してください」 。また、私の質問で言及した例に準拠するようにコードを修正することもできますか? col1? another_attribute? 、ありがとう:) – Goles

0

:classおよび:parentを工場出荷時の定義に使用します。

あなたのスペックでそう
Factory.define :user, :class => User do |u| 
    u.role 'user' 
end 

Factory.define :moderator, :parent => :user do |m| 
    m.role 'modelrator' 
end 

10.times{ Factory :user} 
    9000.times{ Factory :moderator} 
関連する問題