2011-08-01 2 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'オブジェクトからすべての作者を削除したが、あなたの変更をデータベースにコミットしていない可能性があります(' exists? 'は' true'を返します)?この結果の文脈は提供していません。 –

+0

返事ありがとうございましたJeremy、質問を更新しました。 – 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

コンテキストが新しいアクションです。私はジェレミーが上記の彼のコメントに正しいと思った。

ため、非nilの明示的false0、ブール値の比較でtrueと評価されていないRubyの何インチ@article.authors(この場合は空の配列)、または[]です。 []はnilではなく、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

関連する問題