2011-08-01 115 views
1

那麼它怎麼可能這是爲什麼存在?

@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 
+5

是否有可能已從'@ article'對象中刪除了所有作者,但尚未提交對數據庫的更改(因此'存在?'仍然返回'true')?您不提供此結果的任何上下文。 –

+0

謝謝你的回覆傑里米,更新了這個問題。 – pingu

+0

我已經重新創建了你的代碼,在這種情況下,我得到了@ @ article.authors.exists?'返回'false'和'@ article.authors.empty?'返回'true',兩者都如預期的那樣。 –

回答

0

權,想我已經解決了它,因爲@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 

所以它返回是否有沒有作者的文章。

4

這是不是你正在尋找的答案 - 我誤解了問題。我認爲傑里米在他上面的評論中是正確的。

因爲在Ruby中任何非零,沒有明確false計算結果爲true布爾比較,甚至0@article.authors,在這種情況下,是一個空數組,或[][]不是零,也不是false,因此它在布爾比較中被評估爲true。如果數組爲空,則數組對象上的empty?方法返回true,在此例中爲[]

下面是關於這一些更廣泛的信息:http://railsclub.com/2011/03/the-difference-between-nil-true-false-blank-and-empty/

+1

我不認爲這是事實。 'exists?'是ActiveRecord中的一個函數,它查詢數據庫以查看是否可以找到一行,並返回一個布爾值。它不會簡單地在布爾上下文中評估數組。 https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/finder_methods.rb –

+0

對不起,我一定誤會了這個問題,認爲它只是「這怎麼可能呢? @ article.authors「是真的,錯過了」存在?「方法在鏈中。 – Yardboy