Создавать и уничтожать ассоциации HABTM - не фактические записи? - PullRequest
1 голос
/ 19 марта 2012

Это похоже на предыдущий вопрос, но с тех пор наш подход немного изменился.

Мне нужно иметь возможность уничтожать ассоциации между Релизами и Треками + Продукты и Треки, не разрушая сам трек.Затем мне нужно повторно связать трек с любым выпуском или продуктом.

Моими моделями являются следующие:

 class Release < ActiveRecord::Base
   has_many :products, :dependent => :destroy
   has_and_belongs_to_many :tracks
 end

 class Product < ActiveRecord::Base
   belongs_to :release
   has_many :releases_tracks, :through => :release, :source => :tracks      
   has_and_belongs_to_many :tracks
   before_save do
   self.track_ids = self.releases_track_ids
   end        
 end

class Track < ActiveRecord::Base
  has_and_belongs_to_many :releases
  has_and_belongs_to_many :products
end

class ReleaseTracks < ActiveRecord::Base
  belongs_to :release
  belongs_to :track
end

class ProductsTracks < ActiveRecord::Base
  belongs_to :product
  belongs_to :track
end

Может ли кто-нибудь помочь с соответствующими методами контроллера, пожалуйста?

Если я использую, например, следующую информацию в Product Track,разрушает трек и ассоциацию:

 @product = Product.find(params[:product_id])
 @track = @product.tracks.find(params[:id])
 @track.destroy

Я пробовал что-то подобное, но это дает мне неметодеррор:

 @product = Product.find(params[:product_id])
 @track = @product.products_tracks.find(params[:track_id])
 @track.destroy

Может кто-нибудь указать мне правильное направление?Как я уже сказал, это нужно в первую очередь для уничтожения, но мне также нужно иметь возможность воссоздавать ассоциации.

1 Ответ

1 голос
/ 19 марта 2012

has_and_belongs_to_many (HABTM) - это один из способов объявления отношения «многие ко многим» между двумя моделями. Под крышками rails используется простая таблица соединений (таблица только с двумя столбцами, каждый из которых является внешним ключом первичного ключа основных таблиц). Ассоциация существует, когда существует запись в таблице соединений. Я не уверен, как destroy работает по умолчанию в этом случае, но он может решить удалить все связанные записи (не только связь). Вы можете контролировать это, используя предложение dependent <action> в объявлении HABTM. Отношение создается, когда вы назначаете одного или нескольких «потомков» родителю и сохраняете.

В этом случае, возможно, вам нужна пара has_many: сквозные отношения - сквозное отношение - это отношение, но оно может рассматриваться как модель первого класса, расширено и оперировано с ActiveRecord, то есть вы можете например, перейти на конкретный трек релиза и решить удалить его, не затрагивая ни одну из ассоциаций.

В этом руководстве по Rails есть хороший раздел о том, когда использовать одно против другого: http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many

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