【问题标题】:Rails 3: Model.all.count always returns 1 in after_create methodRails 3:Model.all.count 在 after_create 方法中总是返回 1
【发布时间】:2013-05-10 00:07:49
【问题描述】:

如果新创建的记录是第一个满足某些条件的记录,我想检查after_create。所以我希望能够在after_create 回调中检查Model.where(...some condition...).count > 1。但是,由于某种原因,Rails 不允许这样做,我找不到任何解释。如果我在after_create 中查询Model.all.count,它总是返回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"}

【问题讨论】:

  • 你能分享那个模型吗
  • 能否也分享一下错误信息?

标签: ruby-on-rails-3 activerecord callback


【解决方案1】:

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

我不确定,但我猜这是因为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

【讨论】:

  • 是的!因此“where”范围在“after_create”方法中自动应用。这让我有点吃惊,我还有一些学习要做。谢谢!
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 2019-04-27
  • 2013-02-23
  • 2015-06-13
  • 1970-01-01
相关资源
最近更新 更多