0

after_create新しく作成されたレコードが、何らかの条件を満たす最初のレコードであるかどうかを確認したいと思います。Model.where(...some condition...).count > 1だから、after_createコールバックでチェックできるようにしたい。ただし、Rails は何らかの理由でこれを許可しないため、その理由を説明することはできません。でクエリを実行するとModel.all.countafter_create常に 1 が返されます。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 に答える