2013-05-10 44 views
0

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

编辑:

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

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"} 
+0

您可以共享模型 – 2013-05-10 05:04:04

+0

你也可以分享错误消息? – 2013-05-10 17:49:00

回答

2

什么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 
+0

是的!所以“where”范围在“after_create”方法中自动应用。这对我来说有点令人惊讶,我有一些学习要做。谢谢! – garretriddle 2013-05-12 21:07:58