搜索关联

时间:2014-04-25 20:57:16

标签: ruby-on-rails ruby rspec factory-bot

我正在尝试打印工厂bbb_a。

我有两个型号

  • aaa has_many bbbs
  • bbb belongs_to aaa

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

控制台输出

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 个答案:

答案 0 :(得分:1)

您所要做的就是更换

puts aaa.bbbs(:bbb_a)

使用

puts aaa.bbbs.first

或者

puts aaa.bbbs[0]

由于AaaBbb模型之间存在has_many关系,因此rails会为Aaa#bbbsBbb#aaa创建动态实例方法。 此方法接受0或1个参数。如果将参数作为true传递给此方法,则会触发数据库上的查询以检索关联的记录。如果您将此方法的参数作为false传递给它,那么它只会获取查询的缓存结果(提供的查询在缓存之前被触发一次)。

所以,当你这样做时

puts aaa.bbbs(:bbb_a)

传递的值只是被忽略,因为它既不是true也不是false