Я использую ActiveRecord::Base.transaction
, чтобы сделать целую кучу вызовов, относящихся к группе объектов, которые должны обновляться / создаваться одновременно или вообще не обновляться. Один метод в этой транзакции должен использовать where
, чтобы найти и удалить все Trades
, которые соответствуют определенным параметрам.
class Trade < ActiveRecord::Base
include Discard::Model
belongs_to :trade_requester, class_name: "User"
belongs_to :wanted_share, class_name: "Share"
validates :trade_requester, :wanted_share, presence: true
validates :amount, presence: true
def new_wanted_total
wanted_share.amount - amount
end
def update_wanted_share_amount(new_wanted_total)
wanted_share.update_attribute(:amount, new_wanted_total)
end
def delete_extraneous_wanted_trades(wanted_share)
self.class.where("wanted_share_id = ? AND amount > ? AND approved_at = ? AND discarded_at = ?", wanted_share.id, new_wanted_total, nil, nil).delete_all
end
def accept
ActiveRecord::Base.transaction do
delete_extraneous_wanted_trades(wanted_share)
update_wanted_share_amount(new_wanted_total) if new_wanted_total >= 0
Share.create(user_id: self.trade_requester.id, item_id: self.wanted_share.item.id, amount: self.amount, active: false)
self.touch(:approved_at)
end
end
end
Когда я accept
и проверяю вывод в моем терминале, одна строка, которую я получаю, говорит это:
SQL (0.3ms) DELETE FROM "trades" WHERE (wanted_share_id = 8 AND amount > 25 AND approved_at = NULL AND discarded_at = NULL).
Я передаю правильную информацию методу, а остальные выходные данные терминала показывают, что соответствующие записи были обновлены с соответствующими атрибутами (одна Share
установлена на amount:25
, а другая Share
создана с помощью amount:50
). Но затем я проверяю свою базу данных, и она говорит, что есть еще один Trade
для amount: 60
. Эта запись превышает доступную общую сумму, которая сейчас составляет 50 (ранее было 75), и должна была быть удалена. Но согласно выводу терминала это было проигнорировано. Почему эта запись осталась нетронутой?