我有一个事件模型,保存后会更新父用户的某些属性。
class User
has_many :events
end
class Event
belongs_to :user
before_save :update_user_attributes
validates :user, presence: true
def update_user_attributes
self.user.update_attributes(hash_of_params)
end
end
大部分时间都可以正常工作 - 用户必须存在并在与事件交互之前登录。
但是我的测试套件引起了问题,特别是事件工厂。
FactoryGirl.define do
factory :event do
user
end
end
似乎由于FactoryGirl构建事件的顺序,在创建事件时用户不可用,导致update_user_attributes
失败。
这意味着
create(:event)
# ActiveRecord::RecordNotSaved:
# Failed to save the record
但是
build(:event).save
传递没有错误
我可以通过多种方式阻止引发错误,例如,检查user.persisted?
方法中的update_user_attributes
,或运行callaback after_save
。但我的问题特别与FactoryGirl有关。
鉴于上述事实,有没有办法在创建事件之前强制创建关联的用户?
答案 0 :(得分:2)
您可以在FactoryGirl中编写回调:
FactoryGirl.define do
factory :event do
user
before(:create) do |event|
create(:user, event_id: event.id)
end
end
end
还有关于FG回调的article on thoughtbot