Обнулять зависимые объекты в ActiveRecord - PullRequest
7 голосов
/ 10 сентября 2011
:dependent => :nullify

Зачем мне нужно обнулять зависимые объекты, так как я не вижу цели, потеряв записи в базе данных.

Ответы [ 2 ]

19 голосов
/ 10 сентября 2011

Обнуление полезно только в очень специфических случаях;скажем, например, у вас есть несколько проектов, которые могут или не могут быть опрошены одним и только одним агентом (поэтому его поле внешнего ключа, ссылающееся на агента , может * 1006)* быть нулевым).Если агент откажется от всех опросов, которые он обрабатывает (скажем, он был уволен), вы не хотите уничтожать запись проекта, но не можете позволить ей ссылаться на запись агента, которая больше не будет существовать, поэтому вы аннулируетеего поле внешнего ключа.

0 голосов
/ 17 октября 2018

Рассмотрим случай, когда у нас есть несколько магазинов и предметов.У каждого товара может быть много магазинов, и у каждого магазина может быть много товаров, чтобы они были связаны между собой таблицей соединений (или кросс-таблицей).Допустим, что каждый магазин может также проводить свою собственную акцию, содержащую комплект товаров, место, где мы могли бы хранить это, находится на столе присоединения, который может принадлежать акции.В конце рекламной акции ее можно уничтожить, но мы хотим сохранить связь между магазинами и товарами, поэтому мы бы аннулировали promotion_id.

class Store
  has_many :store_items, dependent: :destroy
  has_many :items, through: :store_items
end

class Item
  has_many :store_items, dependent: :destroy
  has_many :items, though: :store_items
end

class Promotion
  has_many :store_items, dependent: :nullify
end

class StoreItem
  belongs_to: :item
  belongs_to: :store
  belongs_to: :promotion, optional: true
end

В идеале мы могли бы разрешить StoreItemиметь много Promotion с, а затем сохранять даты и время в таблице присоединения, чтобы мы знали, когда StoreItem участвовал в повышении или нет, но это может быть слишком сложно.

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