人々がアイテムにサインアップするアプリがあります。各アイテムには限られた数のスロットがあります。同時実行を処理するにはどうすればよいですか? 私は Item クラスでこのように試しました:
def sign_up(signup)
ActiveRecord::Base.transaction do
return 'Sorry, that item is full.' if full?
signups << signup
sheet.save!
nil
end
end
def full?
locked_signups = signups.lock(true).all
locked_signups.size >= max_signups
end
私がやろうとしていることは、ARでも可能ですか? 列を介して独自のロックを実装する必要がありますか? どんな提案でも大歓迎です。
更新:タッドマンの回答に従って、これが機能しました。動作するコードは次のとおりです。
rows_updated = ActiveRecord::Base.transaction do
Item.connection.update "update items set signup_count=signup_count+1 where id=#{ActiveRecord::Base.sanitize(self.id)} and signup_count<quantity"
end
return 'Sorry, that item is full. Refresh the page to see what\'s still open.' if rows_updated < 1