0

レールに 2 つのテーブルがあり
ます

保留中の製品にはステータス フィールドがあります。レコードが保留中のテーブルに追加される (または更新される) と、ステータスは 1 に設定されます。すべての記録が終わったら、すべての 2 を 1000 に変更します。

(なぜ 2 に設定したのか疑問に思われている方のために説明すると、処理中にフィードが入ってきても、フィードによってステータスが 1 に設定されているため、そのレコードが更新されないようにするためです)

すべての 2 を 1000 に変更する前に、処理済みのテーブルに挿入したいと考えています。

これで、純粋な SQL で「挿入」を行うことができますが、これを行うレールの方法があるかどうか疑問に思っています.生の SQL よりもエレガントなもの。

4

1 に答える 1

0

このようなものがうまくいくかもしれません:

class PendingProduct < ActiveRecord::Base
  OUTSTANDING = 1
  PROCESSING = 2
  PROCESSED = 1000

  scope :outstanding, where(status: OUTSTANDING)

  def process
    transaction do
      self.status = PROCESSING
      self.save!

      # do whatever processing you need to do...

      # ...then create your ProcessedProduct record...
      ProcessedProduct.create!( ... )

      # ...and finally update this PendingProduct
      self.status = PROCESSED
      self.save!
    end
  end
end

PendingProduct.outstanding.each(&:process)

これは、生の SQL よりも間違いなく「エレガント」ですが、遅くなることが保証されています。

于 2012-07-06T02:48:58.617 に答える