0

我想检查after_create新创建的记录是否是第一个满足某些条件的记录。所以我希望能够Model.where(...some condition...).count > 1after_create回调中检查 , 。但是,由于某种原因,Rails 不允许这样做,我找不到任何解释。如果我查询, Model.all.count, in after_create,它总是返回1,并且一条记录就是我刚刚创建的一条。如果我在 after_create 方法中执行原始 SQL,那么我可以检索到正确的信息。为什么我不能使用 执行查询Model.where(...)

编辑:

回答以下问题。没有错误消息。下面是记录输出的类和示例。我觉得这一定是我忽略的一些愚蠢的事情,我感谢您的帮助。

class ExperiencePhoto < ActiveRecord::Base
  belongs_to :experience, counter_cache: true
  belongs_to :photo


  after_create :set_cover_photo

  def self.find_or_create(params)
    where(params).first_or_create
  end


  protected

  def set_cover_photo
    logger.debug self.inspect
    logger.debug ExperiencePhoto.all.inspect
    logger.debug ExperiencePhoto.all.count.to_s
    logger.debug ActiveRecord::Base.connection.execute("select count(*) from experience_photos")[0].inspect

  end

结尾

调用这个:

ExperiencePhoto.find_or_create(photo_id: photo_id, experience_id: self.id)

导致此输出:

#<ExperiencePhoto id: 183, experience_id: 93, photo_id: 106>
[#<ExperiencePhoto id: 183, experience_id: 93, photo_id: 106>]
1
{"count"=>"168"}
4

1 回答 1

2

日志显示的 SQL 是什么ExperiencePhoto.all.count

我不确定,但我猜这是因为set_cover_photo在之前的范围内调用了where.

尝试将其包装在unscoped中:

def set_cover_photo
  ExperiencePhoto.unscoped do
    logger.debug self.inspect
    logger.debug ExperiencePhoto.all.inspect
    logger.debug ExperiencePhoto.all.count.to_s
    logger.debug ActiveRecord::Base.connection.execute("select count(*) from experience_photos")[0].inspect
  end
end
于 2013-05-12T01:49:13.690 回答