Rails更新参数问题

时间:2016-09-30 21:48:51

标签: ruby-on-rails activerecord

我有一个问题,我无法理解...... 在我的项目中,我有几个模型。我有channel有很多restreams,每个restream有一个provider(这是一个多态协议)。

因此,在代码中,我将一个restream.provider替换为另一个restream.provider,最后nil的值为puts channel.restreams.last.provider.to_json byebug Delayed::Job.enqueue(StartRestreamJob.new(air.id)) if air.server.online? 。我试图输入很多测试输出,所以现在我有这样的结果:在其中一个控制器中我有一个代码:

puts

start_restream_job完全符合我的预期:提供者对象,转换为json。但在air = Air.find(air_id) channel = air.channel puts channel.restreams.last.provider.to_json byebug 我也有代码:

null

它只为我提供了restream字符串。因此,保存在数据库中的provider对象与provider无关。 它可能有什么问题?

感谢名单!

======================

将新restream分配给new_provider = ProviderType1.new(restream.provider.params_hash) #params hash provides some variables that I need to save from old provider old_provider = restream.provider new_provider.restream = restream res = new_provider.initialize_event #here some requests for external services are being made, after what some attributes of provider are being updated and after that provider is being saved by calling self.save! if res == ProviderType1.SUCCESS_CODE old_provider.restream = nil old_provider.save! old_provider.destroy new_provider.restream = restream restream.provider = new_provider restream.save! new_provider.save! else #smth that does not matter now end 的代码:

channel.restreams.each do |r|
  r.provider.save!
  r.save
end

========================

UPD

即使添加restream和提供者的强制保存也没有任何意义:

provider

我仍然在DB中保存了一个新的restream对象,但它与channel.restreams.each do |r| r.provider.save! r.save! puts ProviderType1.find(r.provider_id).restream.to_json 对象没有关联,反之亦然。

=============

UPD 2

为一些代码添加打印为我开辟了新的东西:

null

打印出r.provider.save!。这是否意味着puts channel.restreams.last.provider.to_json什么都不做?如果是,那么为什么呢?为什么它保持沉默? (这在代码中的某个位置运行,其中null打印出一个对象,而不是DatabaseReference database = FirebaseDatabase.getInstance().getReference(); DatabaseReference myRef = database.child("profiles/"); myRef.child(phoneNo).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { user = dataSnapshot.getValue(User.class); } @Override public void onCancelled(DatabaseError databaseError) {} });

1 个答案:

答案 0 :(得分:0)

帮助我的事情:在更新这样的参数之前将reload添加到restreamrestream.reload.update_attributes(provider: new_provider)