【问题标题】:ActiveRecord relationship validation with error trying to use 'count'ActiveRecord 关系验证尝试使用“计数”时出错
【发布时间】:2013-01-22 04:31:21
【问题描述】:

我有一个 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 是零?

【问题讨论】:

    标签: ruby-on-rails ruby validation rails-activerecord


    【解决方案1】:

    尝试使用.length 而不是.count

    当您使用count 时,您实际上是在执行数据库查询。而且因为您是在验证时进行的,所以在将任何内容保存到数据库之前,您总是得到零。另一方面,length 在对象级别上工作,根本不会访问数据库。所以它应该适合你。

    【讨论】:

    • 谢谢!这让我很烦。
    【解决方案2】:

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

    你应该阅读count vs length vs size

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2021-05-24
      • 1970-01-01
      • 2020-01-13
      相关资源
      最近更新 更多