0

Order クラスと Pack クラスがあり、どちらも ActiveRecord を使用しています。注文にはパックが含まれています。注文の検証では、1 つ以上のパックとの関係の存在をテストしています。次のコードを参照してください。

class Order < ActiveRecord::Base
  belongs_to :user
  has_many :order_packs
  has_many :packs, :through => :order_packs
  validate :my_custom_validation

  def my_custom_validation
    errors.add(:packs, "Your order was empty.") if packs.count < 1
  end
end

簡単そうに見えますが、うまくいきません。packs.countは常にゼロです。そこで、検証を次のコードに変更しました。

def my_custom_validation
  errors.add(:packs, "packs is: #{packs}")
  errors.add(:packs, "packs.count is: #{packs.count}")
  errors.add(:packs, "packs.any? is: #{packs.any?}")
end

取り引きが何であるかを確認するだけで、次の興味深い出力が得られました。

ここに画像の説明を入力

なぜcountゼロなのか誰か教えてください。

4

2 に答える 2

2

.lengthの代わりに使ってみてください.count

を使用countすると、実際にデータベース クエリが実行されます。また、データベースに何かが保存される前に検証を行っているため、常にゼロになります。length一方、オブジェクト レベルで動作し、データベースにはまったくヒットしません。だから、それはあなたのために働くはずです。

于 2013-01-22T04:34:13.343 に答える
1

長さとサイズはどちらも同じで、count は SQL COUNT クエリを実行します。

カウント対長さ対サイズを読む必要があります

于 2013-01-22T04:45:20.723 に答える