【问题标题】:Why has defined? a state为什么有定义?一个状态
【发布时间】: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


【解决方案1】:

从表面上看,MongoMapper 正在懒惰地创建属性,defined? 不是检查字段的 value 而是检查 field 是否已定义,所以你'将需要找到更好的测试来满足您的预期目标。 There is a discussion about adding lazy attributes from a while back on the mailing list,虽然我不知道它是否曾经实现过。

第一次创建对象时,它有一个music post,所以它得到一个true,但vid post 没有。第二次您不使用音乐帖子字段但它是使用最后一个对象创建的,所以您得到truetrue。对象 3 也会因此得到 true true

尝试先放置第二个对象。如果vid post 得到truemusic post 得到错误,你就会知道这是关于属性定义方式的问题。

【讨论】:

  • 我通过更改对象顺序来测试您的想法,在这种情况下您的权利对于 vid post 是正确的。但我仍然不明白这到底是怎么发生的。
猜你喜欢
  • 2014-06-19
  • 2017-04-07
  • 2021-12-16
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2020-11-07
相关资源
最近更新 更多