2014-04-25 2 views
0

Я пытаюсь распечатать заводскую bbb_a.Поиск ассоциаций

У меня есть две модели

  • ааа has_many БББС
  • ГЭБ belongs_to ааа

aaas.rb

FactoryGirl.define do 
    factory :aaa do 
    after(:build) do |aaa| 
     aaa.bbbs << build(:bbb_a) 
     aaa.bbbs << build(:bbb_b) 
    end 
    end 
end 

bbbs.rb

FactoryGirl.define do 
    factory :bbb do 
    factory :bbb_a do 
    end 
    factory :bbb_b do 
    end 
    end 
end 

aaa_spec.rb

require 'spec_helper' 
describe Aaa do 
    it "works" do 
    aaa = FactoryGirl.create(:aaa) 
    puts aaa.bbbs(:bbb_a) #This gives both bbb_a and bbb_b 
    aaa.should_not be_nil 
    end 
end 

Console Output

Bbb 1 
Bbb 2 
. 

Finished in 0.11593 seconds 
1 example, 0 failures 

Randomized with seed 44359 

что я ожидал

Bbb 1 
. 

Finished in 0.11593 seconds 
1 example, 0 failures 

Randomized with seed 44359 

Почему он помещает как bbb_a, так и bbb_b? Как я могу заставить его просто печатать bbb_a?

ответ

1

Все, что вам нужно сделать, это заменить

puts aaa.bbbs(:bbb_a) 

С либо

puts aaa.bbbs.first 

Или

puts aaa.bbbs[0] 

Потому что у вас есть отношения has_many между Aaa и Bbb моделей, создает рельсы методы динамического экземпляра для вас как Aaa#bbbs и Bbb#aaa. Этот метод принимает 0 или 1 аргумент. Если вы передадите аргумент этому методу как true, он запускает запрос в базе данных для получения связанных записей. И если вы передадите аргумент этому методу как false, он просто подберет кешированные результаты запроса (при условии, что запрос был уволен один раз раньше для кэширования).

Итак, когда вы делаете

puts aaa.bbbs(:bbb_a) 

Значение, переданное просто игнорируется, как его ни true или false.

+0

Скажите, что у меня 1000 из этих bbbs, и я не знаю, к какому значению идет [#]. Есть ли способ поиска ценности? –

+1

Если вы знаете значение какого-либо уникального атрибута или идентификатора, просто укажите его 'aaa.bbbs.where (attr1: value)' –

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