2014-02-21 5 views
0

Я хотел бы уточнить что-то об ActiveRecord. У меня такой сценарий:Условия гонки ActiveRecord в действиях

class Purchase < ActiveRecord::Base 
    belongs_to :song 
end 

class Song < ActiveRecord::Base 
    has_many :purchases 
    validate :cannot_update_if_being_sold 

    def cannot_update_if_being_sold 
    errors.add(:song, "Cannot update beats while beat is being sold.") if !self.purchases.empty? 
    end 
end 

Теперь можно сказать, что у меня есть существующий экземпляр песни, и я пытаюсь его обновить. Здесь нет гонки? В частности:

  1. Run песня валидация, все проходит
  2. Создать покупку для песни и сохранить в БД
  3. Сохранить песню DB

Как я могу предотвратить это? Я не уверен, как использовать блокировки в этом сценарии, поскольку покупки - has_many.

Спасибо!

+0

Что такое «состояние гонки»? – MrYoshiji

+0

«Состояние гонки» - это обстоятельство, при котором два процесса происходят отдельно, и вы получаете непредсказуемые результаты, потому что вы не знаете, какой из них произойдет первым. Я не думаю, что это пример условий гонки. –

+0

Не может ли покупка этой песни произойти после прохождения валидации песни и до того, как песня действительно будет обновлена ​​в БД? В частности, значение self.purchases может измениться после его вызова в проверке проверки. Правильно? – deruse

ответ

0

Приобретение затрагивает модель Покупки, а обновления песни влияют на модель песни.
Поскольку ActiveRecord сопоставляет эти модели для разделения таблиц в базе данных, нет никаких условий гонки, связанных с доступом к ним отдельно.

Однако, я вижу, если вы хотите УДАЛИТЬ песню, любые сделанные покупки будут порождать ошибки. Задайте этот сценарий, а не UPDATE.

Кроме того, но это должно быть стандартным, не обновляйте первичный ключ для своих песен.

Смежные вопросы