如何在rails事务中使用after_create回调创建关联对象

时间:2015-05-15 08:31:04

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-3.2

我有保存会话和活动的方法

def create_session
   new_session = NewSession.new
   new_session.transaction do
       new_session.name = 'Somename'
       ....
       new_session.save!
       event =  new_session.event        #returning nil why?
       puts event.new_session 
   end
end

我的NewSession班级

class NewSession < ActiveRecord::Base    
   has_one :event, :class_name => SessionEvent, :dependent => :delete
   after_create :create_event

   def create_event
       SessionEvent.create(:name => 'Eventname', :new_session => self)
   end 

end

现在如何在rails transaction

中使用after_create回调创建关联对象

3 个答案:

答案 0 :(得分:1)

尝试这样做:

class NewSession < ActiveRecord::Base    
   has_one :event
   after_create :create_event

   def create_event
     self.event.create(:name => 'Eventname')
   end 

end

但请确保您的事件表中有'new_session_id',如果没有,则将其添加到事件表或在您的关联中定义foreign_key:

 has_one :event, :foreign_key => "new_session"

现在使用您自己的型号代码。

修改

而不是将整个'self'保存在事件模型中,只需将'self.id'保存为:

def create_event
   Event.create(:name => 'Eventname', :new_session => self.id)
end 

按照我上面建议的那样定义你的配置 has_one:event,:foreign_key =&gt; “new_session”

希望这会对你有所帮助。

答案 1 :(得分:0)

确保您的事件表中有'new_session_id',然后

class NewSession < ActiveRecord::Base    
  has_one :event
  after_create :create_event

  def create_event
     self.event.create(:name => 'Eventname')
  end 

end

答案 2 :(得分:0)

after_create() -

在Base.save之后调用尚未保存的新对象(不存在记录)。请注意,此回调仍包含在围绕保存的事务中。例如,如果此时调用外部索引器,则不会在数据库中看到更改。

所以我建议你使用 after_save 回调