制作的模型与磁盘上的模型不同

时间:2013-10-10 13:23:38

标签: ruby-on-rails rspec fabrication-gem

我可能在这里误解了一些东西。

我有一个模型Secondant,我在我的模型rspec中使用Fabrication创建。

main_user = Fabricate :user, email: TESTEMAIL
sec = Fabricate :secondant, email: SECEMAIL, user_id: main_user.id
sec_user = Fabricate :user, email: SECEMAIL
ActionMailer::Base.deliveries = []
debugger

此时,当我查看sec模型中secondant_id的值时,该属性为空(它在after_create回调中填充)。当我检索刚从数据库中创建的模型时,该属性被填充。为什么这两个不同步?

   27        main_user = Fabricate :user, email: TESTEMAIL
   28        sec = Fabricate :secondant, email: SECEMAIL, user_id: main_user.id
   29        sec_user = Fabricate :user, email: SECEMAIL
   30        ActionMailer::Base.deliveries = []
   31        debugger
=> 32        sec.destroy
   33      end
   34
   35      it 'should have a secondant_id assigned' do
   36        sec.secondant_id.should_not be_nil
(rdb:1) e sec
#<Secondant id: 519, user_id: 1095, email: "secondant@hotmail.com", secondant_id: nil, created_at: "2013-10-10 13:13:29", updated_at: "2013-10-10 13:13:29", reported: false>
(rdb:1) e Secondant.where(id: sec.id).first
#<Secondant id: 519, user_id: 1095, email: "secondant@hotmail.com", secondant_id: 1096, created_at: "2013-10-10 13:13:29", updated_at: "2013-10-10 13:13:29", reported: false>

我的after_create回调:

  def find_user
    user = User.where(email: self.email).first

    if user
      # create the link to the user
      self.secondant_id = user.id
      self.save

      # see if this is the second one
      if Secondant.where('user_id = ? and secondant_id is not null', user_id).count == 2
        user.do_somthing
      end
    end

    return
  end

修改

在用户类中有一个类似的回调,在这种情况下触发(感谢Peter)

  def find_secondant
    Secondant.where(email: email).find_each do |sec|
      sec.secondant_id = id
      sec.save
    end
  end

1 个答案:

答案 0 :(得分:0)

在您创建sec时,尚未创建具有相同电子邮件的用户,因此您的after_save回调应该设置secondant_id

我只能假设您的find_user方法是由于您在调试器中执行的User创建或where操作而被调用的,从而导致{{1当时正在设置的字段。除非{直到你执行secondant_id,否则它不会反映在sec中,因为reload创建的Ruby对象与where Ruby对象不同。