为什么会这样?

时间:2011-08-01 20:41:33

标签: ruby-on-rails ruby-on-rails-3 activerecord collections

那怎么可能

@article.authors.exists? 

是真的,

@article.authors.empty?

也是如此????

上下文是一个新动作:

def new
  @article = Article.new
  # @article.build.authors unless @article.authors.exists?
  # @article.build.authors if @article.authors.empty?
end

class Article < ActiveRecord::Base
  has_many :authors
  accepts_nested_attributes_for :authors
end

2 个答案:

答案 0 :(得分:4)

这不是你要找的答案 - 我误解了这个问题。我认为Jeremy在上面的评论中说得对。

因为在Ruby中,任何非零且未明确false的内容在布尔比较中评估为true,甚至0。在这种情况下,@article.authors是一个空数组,或[][]不是nil,它不是false,因此在布尔比较中它被评估为true。如果数组为空,则数组对象上的empty?方法返回true,或[],在这种情况下为{。}}。

以下是有关此内容的更广泛信息:http://railsclub.com/2011/03/the-difference-between-nil-true-false-blank-and-empty/

答案 1 :(得分:1)

是的,我想我已经解决了,因为@article尚未保存,

@ article.authors.exists?

运行sql:

[1m[36mCACHE (0.0ms)[0m  [1mSELECT 1 FROM `authors` WHERE `authors `.`type` IN ('professional') AND `authors `.`article_id` IS NULL LIMIT 1[0m

所以它返回是否有任何作者没有文章。