Ruby on rails 在另一个字段中使用FactoryGirl对象id?

Ruby on rails 在另一个字段中使用FactoryGirl对象id?,ruby-on-rails,factory-bot,Ruby On Rails,Factory Bot,是否有更好的方法在对象创建期间使用对象的id?这是在上述场景中出现的 它还出现在另一个场景中,其中foo在使用foo.id的\u create\u回调之前有一个ActiveRecord。对于AR,调用回调时对象有一个id,方法按预期执行。使用FG,调用回调时对象没有id,因此方法的行为不符合预期。我再次求助于使用额外显式保存的after_create 对于在FactoryGirl对象创建过程中使用对象id的任何建议/提示,我们将不胜感激。下面是一个在irb中rails之外工作的完整示例。但是,您

是否有更好的方法在对象创建期间使用对象的id?这是在上述场景中出现的

它还出现在另一个场景中,其中foo在使用foo.id的\u create\u回调之前有一个ActiveRecord。对于AR,调用回调时对象有一个id,方法按预期执行。使用FG,调用回调时对象没有id,因此方法的行为不符合预期。我再次求助于使用额外显式保存的after_create


对于在FactoryGirl对象创建过程中使用对象id的任何建议/提示,我们将不胜感激。

下面是一个在irb中rails之外工作的完整示例。但是,您必须安装正确的gems

在sqlite中创建表:

factory :foo do
  bar # want this to use foo's id in calculating bar's value

  # current solution
  # ugly because it requires an extra save
  after_create { |foo| foo.bar = foo.id; foo.save! }

  # tried this too but foo.id is still nil at this point
  # after_build { |foo| foo.bar = foo.id } 
end
注意,这是factory_girl 3.x语法

sqlite3 /tmp/development.db
> create table foos ( id int, name varchar(50), primary key(id));
> create table bars ( id int, name varchar(50), foo_id int, primary key(id));
很抱歉,这是一个非常非railsy的例子,但至少你可以在不干扰你的项目的情况下在一旁玩这个

require 'factory_girl'
require 'active_record'
require 'active_support'

ActiveRecord::Base.establish_connection(
  :adapter => 'sqlite3', :database => '/tmp/development.db'
)

class Foo < ActiveRecord::Base
  attr_accessible :id, :name
  has_one :bar
end

class Bar < ActiveRecord::Base
  attr_accessible :id, :name
  belongs_to :foo
end

FactoryGirl.define do
  factory :foo do
    sequence :id do |n|
      n
    end
    name "Foo Name" # use Faker
  end
end

FactoryGirl.define do
  factory :bar do
    sequence(:id) {|n| n }
    association :foo, :factory => :foo
    name "Bar Name" # use Faker
  end
end

bar = FactoryGirl.build(:bar)
puts bar.inspect
# => #<Bar id: 1, name: "Bar Name", foo_id: 1>
> delete from foos;
> delete from bars;