新手问题 rails 的 any? 的奇怪问题

2forVendetta · 2013年05月22日 · 最后由 doitian 回复于 2013年05月22日 · 3023 次阅读

这是我一开始的代码 @discussion.topics里是有数据的 但是输出的 else 里面的东西

然后我把@discussion.topics打印了一下 显示 @discussion.topics.any? 是假

我很郁闷 在控制台里打印明明是 true 然后我又把@discussion.topics打印了一下 我靠 我彻底晕了@discussion.topics里是有数据的 @discussion.topics.any? 变成了 ture

紧接着我又恢复到第一步 结果还是输出 else

最后我只能改成 length

输出正常 既然用 discussion.topics.length 正常显示说明@discussion.topics里却是有数据 不理解 请教下各位

puts 'hi' if 0

是不是延迟加载的问题?

感觉你两边调试的时候 @discussion 不是同一个对象呢。

有一个可能的情况是你用 @discussion.topics << topic 添加了一个新的 topic 但是这个 topic 并没有保存成功。这种情况下 @discussion.topics 已经 eager loaded 了,而且这个更新失败的 topic 包含在这个加载后的 cache array 中。但是 @disucsion.topics.any? 是从数据库查询的,如果这个新的 topic 没有保存成功,数据库里还是空的,所以会返回 false

你可以打印下看看

@discussion.errors.full_messages
@discussion.topics.to_a.collect(&:errors).collect(&:full_messages)
@discussion.topics.to_a.collect(&:changed?)

如果确实想把出错的 topic 也显示,可以有 to_a 强行转成 array 再调用 array 的 any? 的方法

需要 登录 后方可回复, 如果你还没有账号请 注册新账号