вызывая self.class.where () в транзакции, но записи, которые я пытаюсь выбрать, игнорируются - PullRequest
0 голосов
/ 30 апреля 2018

Я использую 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), и должна была быть удалена. Но согласно выводу терминала это было проигнорировано. Почему эта запись осталась нетронутой?

1 Ответ

0 голосов
/ 02 мая 2018

approved_at = ? AND discarded_at = ? в предложении where должно быть approved_at IS NULL AND discarded_at IS NULL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...