我有一个问题,我无法理解......
在我的项目中,我有几个模型。我有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) {}
});
)
答案 0 :(得分:0)
帮助我的事情:在更新这样的参数之前将reload
添加到restream
:restream.reload.update_attributes(provider: new_provider)