2015-03-01 2 views
0

Я использовал dependent: :destroy на моделях, прежде чем с какой-либо проблемой, но в рельсах 4.2. Я застрял. Использование прошлого использовалось в основном для классических моделей has_many belongs_to. Кажется, что #<ActiveRecord::Associations::CollectionProxy вызывает мои проблемы.Rails 4.2 зависит:: уничтожить проблемы с CollectionProxy

Модели
class Subject < ActiveRecord::Base 
     has_many :properties 
     has_many :values, :through => :properties 
     has_many :tags, :through => :properties 

    class Property < ActiveRecord::Base 
     belongs_to :subject 
     belongs_to :tag 
     belongs_to :value 

    class Value < ActiveRecord::Base 
     has_one :property 
     has_one :subject, :through => :property 
     has_one :tag, :through => :property 

    class Tag < ActiveRecord::Base 
     has_many :properties 
     has_many :subjects, :through => :properties 

Мои цели были

  • Удаление Subject будет удалить все связанные с ним свойства и значения
  • Удаление свойства удалит соответствующее значение, оставляя Subject нетронутыми
  • или, При удалении значения удаляется связанное с ним свойство, оставляя объект неповрежденным

Я попытался добавить зависимое уничтожение в строке значений в Subject и в строке свойств в Value. Он удалит свойства, но не значения. Я попытался поместить его в строку свойств и строку значений свойств в Property и получил те же результаты - он не удалит значения.

Затем я попытался установить фильтр before_destroy и столкнулся с тем же типом проблемы или ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR, когда попробовал ассоциации моделей. Затем я взломал его и получил его на работу:

# In Subject model 
    before_destroy :destroy_values 
    def destroy_values 
     # relations does not seem to work got the Values using a new query 
      #values.destroy_all 
     pids = values.pluck(:id) 
     Value.where(id:pids).destroy_all 
    end 

    # in Value model 
    before_destroy :destroy_property 
    def destroy_property 
     property.destroy 
    end 

Не уверен, что происходит, читайте столько, сколько я мог на dependent и попытался delete_all, и каждая вещь, которую я видел, не радость!

Да, это странная модель, просто играющая вокруг и пытающаяся воспроизвести «Что?» База данных Apple II в рельсах для усмешек.

ответ

0

Иногда, когда вы застреваете вокруг кругов, вам просто нужно задать вопрос. Когда вы не получите ответ, у вас есть время переосмыслить проблему. Наверное, я не пробовал все варианты.

Я думаю, что проблема заключается в том, что я не понимаю стратегию по умолчанию для nullify. Согласно моим целям, вы не можете иметь ценность без собственности и наоборот. Попытка уничтожить с помощью сквозной ассоциации повысит ошибку pg. Простое решение, которое я, по-видимому, не пытался, заключалось в зависящем от уничтожения свойствах в модели Subject и зависимом значении destroy в модели Property. Предупреждение в руководстве, чтобы не использовать зависимое уничтожение в ассоциации belongs_to, возможно, начало мое круговое путешествие. Я все еще не уверен, что понимаю предупреждение. Я предполагаю, что когда subject.properties будет уничтожен, объект subject_id будет установлен в null до того, как будет выполнен вызов уничтожения property.value, избегая ошибки pg. Мое очищенные модели:

class Subject < ActiveRecord::Base 
     has_many :properties, dependent: :destroy 
     has_many :values, :through => :properties 
     has_many :tags, :through => :properties 

    class Property < ActiveRecord::Base 
     belongs_to :subject 
     belongs_to :tag 
     belongs_to :value, dependent: :destroy 

    class Value < ActiveRecord::Base 
     has_one :property 
     has_one :subject, :through => :property 
     has_one :tag, :through => :property 
Смежные вопросы