2013-09-20 2 views
0

Я хочу создать фабрику для модели Relationship, которая содержит два атрибута followed_id и follower_id, но я понятия не имею, как это сделать, это подать мои заводы:как создать фабрику для отношений между двумя пользователями

FactoryGirl.define do 

    factory :user do 
    sequence(:name) { |n| "Person #{n}" } 
    sequence(:email) { |n| "person_#{n}@example.com"} 
    password "foobar" 
    password_confirmation "foobar" 
    end 

    factory :relationship do 
    # i need something like this 
    # followed_id a_user.id 
    # follower_id another_user.id 
    end 

end 

обновление

, что я хочу сделать с этим отношением заводом, чтобы проверить, что если я уничтожить пользователь, все его отношения будут уничтожены тоже, это мой тест:

describe "relationships associations" do 

let!(:relationship) { FactoryGirl.create(:relationship) } 
it "should destroy associated relationships" do 
    relationships = @user.relationships.to_a 
    @user.destroy 
    expect(relationships).not_to be_empty 
    relationships.each do |relationship| 
    expect(Relationships.where(id: relationship.id)).to be_empty 
    end 
end 

конец

ответ

0

использование association

factory :relationship do |r| # 'r' is how you call relationship in the block 
    ... 
    r.association :followed #relationship is associated with followed user 
    #(i'm not sure how your application is set up, 
    #so you'll have to do this as best makes sense. 
    #is followed an attribute of user? 
    #then it would look like `r.association :user` 
    f.association :follower #same here 
    end 
+0

Вы можете объяснить, что вы здесь делаете, пожалуйста? а также то, что является r переменным и последовательным и последователем !!! – medBo

+0

это не работает для меня – medBo

+0

обновил мой ответ. – dax

0

В моем опыте такого "отношения" фабрики редко требуется в тесте. Вместо этого часто используются «user_with_followers» и «user_following_some_ones».

factory :user do 
    sequence(:name) { |n| "Person #{n}" } 
    sequence(:email) { |n| "person_#{n}@example.com"} 
    password "foobar" 
    password_confirmation "foobar" 

    factory :user_with_followers do 
    ignore do 
     followers_count 5 
    end 

    after_create do |user, evaluator| 
     followers = FactoryGirl.create_list(:user, evaluator.followers_count) 
     followers.each do |follower| 
     follower.follow(user) # Suppose you have a "follow()" method in User 
     end 
    end 

    factory :user_following_some_ones do 
    # Do the similar 
    end 
end 

# Use 
FactoryGirl.create :user_with_followers 
+0

Билли, не могли бы вы уточнить свой ответ, чтобы напрямую обратиться к его вопросу? Я думаю, было бы неплохо показать, что вы просто создаете подобные «отношения». Кроме того, мне нужно лучше понять мои три варианта: а) делать то, что вы показали, б) использовать механизм «ассоциации» и в) просто предоставлять ссылки на связанные объекты. –

+0

@PeterAlfvin, IMO нет «отношений», но «следование» и «соблюдение» только :) Мы должны указать точное отношение и создать дополнительных пользователей при использовании фабрики. Моя практика заключается в том, чтобы часто использовать #c, а иногда и #a. Для #b я не знаком. –

0

В более поздних версиях FactoryGirl, вы должны быть в состоянии сделать это:

factory :relationship do 
    association :followed, :factory => :user 
    association :follower, :factory => :user 
end 

Что каждый из этих двух association линий делает это создать пользовательский экземпляр (используя свой :user завод) , а затем назначить followed или follower текущего экземпляра отношения.

Обратите внимание, что вам нужно указать завод, если имя ассоциации и заводское имя не совпадают.

Update:

При создании отношения укажите :followed или :follower (что применимо к вам). В противном случае он создает новые пользовательские записи для каждого из них и использует их.

FactoryGirl.create(:relationship, :followed => @user) 
+0

не работает для меня :( – medBo

+0

Какое указание на то, что завод не работает? Говорит ли он, что в вашей модели есть ошибка проверки или она дает вам конкретную ошибку FactoryGirl? – kristinalim

+0

Я создаю связь с заводом-изготовителем это: let! (: relationship) {FactoryGirl.create (: relationship)}, тогда я делаю отношения = @ user.relationships.to_a, наконец, когда я тестирую это: expect (отношения) .not_to be_empty он терпит неудачу и говорит, что он пуст – medBo

Смежные вопросы