0

我有一个 Order 类和一个 Pack 类,它们都使用 ActiveRecord。订单包含包装。在我对订单的验证中,我正在测试是否存在与一个或多个包的关系。请参阅以下代码:

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

length 和 size 都一样,count 执行 SQL COUNT 查询,

您应该阅读计数 vs 长度 vs 大小

于 2013-01-22T04:45:20.723 回答