【发布时间】:2014-05-17 11:26:25
【问题描述】:
我在我的 sinatra 应用程序中遇到了一个非常奇怪的问题。重要的代码部分是这个:
puts "url: #{url.inspect}"
is_music_post = nil
is_video_post = nil
is_music_post = defined?(url.music_post_id) != nil
is_video_post = defined?(url.video_post_id) != nil
puts "vid post: #{is_video_post}"
puts "music post: #{is_music_post}"
URL 对象来自 mongo 映射器。它们看起来像这样:
对象 1
#<Url _id: BSON::ObjectId('5345d525dcdda73224000240'), music_post_id: BSON::ObjectId('5345d51fdcdda7322400023d'), nice: "beat-rooftop", post_id: nil>
在这里它按预期工作并返回:
vid post: false
music post: true
对象 2
#<Url _id: BSON::ObjectId('5345d2f6dcdda732240001d8'), nice: "my-tale-boney-m-steppenwolf", post_id: nil, video_post_id: BSON::ObjectId('5345d2f6dcdda732240001d7')>
这里变得很奇怪,我预计 vid 帖子为真,音乐帖子为假,但我明白了:
vid post: true
music post: true
对象 3
#<Url _id: BSON::ObjectId('5345d525dcdda73224000240'), music_post_id: BSON::ObjectId('5345d51fdcdda7322400023d'), nice: "beat-rooftop", post_id: nil>
和她一样,两个值都是真的
vid post: true
music post: true
WFT
所以我的猜测是某处某物持有这种状态。那么我怎么能强迫它每次都重新评估呢?
我的系统
ruby -v ruby 2.0.0p353(2013-11-22 修订版 43784)[x86_64-linux]
更新
我认为@iain 对延迟加载的解释可能是正确的。如果这是真的,我该如何禁用这种情况?
【问题讨论】:
-
你能打印出
defined?(url.music_post_id)给你的东西吗,这会给你一个关于正在发生的事情的提示 -
当它为 true 时返回方法,当它为 false 时返回 nil 或什么都没有,没有什么意外
-
如果不出意外那我不明白这个问题
-
不出所料,我的意思是它们对应于真假值
标签: ruby sinatra mongomapper