Отношения habtm не поддерживают :зависимую опцию

Правда ли, что отношения HABTM не поддерживают вариант :dependent?

class Person < ActiveRecord::Base
  has_and_belongs_to_many :posts, :dependent => :destroy
end

Я пробую край рельсов.


person Nick Vanderbilt    schedule 10.05.2010    source источник
comment
В качестве упражнения я рекомендую прочитать эту часть API под названием Deleting from associations, особенно в части What gets deleted?. Это помогло мне понять, почему и что происходит за api.rubyonrails. .org/classes/ActiveRecord/Associations/   -  person lucasarruda    schedule 25.07.2018


Ответы (3)


Ага, не поддерживает. см. документацию. Обычно habtm предназначен только для очень-очень простых случаев, и если вам нужны более сложные вещи, вам следует переключиться на has_many :through.

person Jakub Hampl    schedule 10.05.2010

Если вы хотите сохранить простую ассоциацию has_and_belongs_to_many, вы можете добавить это:

class Person < ActiveRecord::Base
  has_and_belongs_to_many :posts
  before_destroy { posts.clear }
end

Что очистит таблицу соединений от всех записей этого person. Примечание. Это только удаляет записи из таблицы соединения, но не уничтожает posts (что имеет смысл, если это двунаправленное has_and_belongs_to_many, поскольку на post может ссылаться другой persons).

Но, судя по вашим именам (Person и Post), я бы предположил, что вам, вероятно, сойдет с рук Person has_many :posts и Post belongs_to :person, и в этом случае вы можете использовать :dependent => :destroy в ассоциации has_many.

person Matt Connolly    schedule 09.02.2012
comment
Не могли бы вы добавить, как бы вы реализовали действие dependent: :destroy для двунаправленного отношения has_and_belongs_to_many, которое ссылается на одну и ту же модель? - person JJD; 01.02.2013
comment
Я не уверен, что синтаксис изначально был похож на этот ответ, но я знаю, что в рельсах 4 он должен быть before_destroy { posts.clear } - person mkralla11; 25.07.2013
comment
также вы можете использовать это, чтобы получить весь эффект уничтожения after_destroy do User.find(:all, :uniq => true, :joins => :posts, :conditions => 'posts.id is NULL').each(&:destroy) end, но также можете использовать has_many в этот момент. - person Xitcod13; 15.03.2014
comment
Я обнаружил, что мне не нужно делать before_destroy { posts.clear } в rails 4.2.0 (postgresql). Rails удаляет отношение по умолчанию (он не удаляет связанную запись, публикацию в этом примере). - person Fatih; 10.02.2015
comment
Хороший совет Вера. has_and_belongs_to_many продолжает удалять ассоциации в rails 5.0.0beta2 - person pctj101; 20.02.2016
comment
Комментарий @Fatih должен быть ответом! - person abhishek77in; 13.02.2017

Попробуй это:

class Person < ActiveRecord::Base
  has_and_belongs_to_many :posts
  before_destroy do
    posts.each { |post| post.destroy }
  end
end

Вам не нужно post.clear, так как Rails 4.2+ уже обрабатывает это.

person moeabdol    schedule 10.06.2017
comment
Это правильный ответ. Rails 4.2+ и 5+ уничтожат таблицу ассоциаций, как только вы уничтожите ассоциацию HABTM. - person lucasarruda; 25.07.2018