2013-05-10 43 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