Хотелось бы знать, откуда у всех появилась идея использовать has_and_belongs_to_many
, потому что управлять этим действительно сложно, даже если в начале это кажется простым.Лучшим подходом является наличие отношения типа has_many ..., :through
, потому что вы можете управлять отдельными ссылками и легко добавлять к ним метаданные.
Например, вот простое двустороннее соединение с промежуточной моделью:шаблон, который вы найдете, встречается довольно часто:
class Post < ActiveRecord::Base
has_many :post_tags
has_many :tags, :through => :post_tags
end
class Tag < ActiveRecord::Base
has_many :post_tags
has_many :posts, :through => :post_tags
end
class PostTag < ActiveRecord::Base
belongs_to :post
belongs_to :tag
end
Добавление и удаление ссылок тегов на этом этапе тривиально:
@post = Post.find(params[:post_id])
if (params[:tags].present?)
@post.tags = Tag.where(:name => params[:tags].split(/\s*,\s*/))
else
@post.tags = [ ]
end
Менеджер отношений has_many
создаст, обновит илипри необходимости уничтожьте PostTag
модели ассоциаций.
Как правило, вы развиваете модель Post, чтобы включить вспомогательный метод для извлечения и назначения тегов с использованием любого разделителя, который вам нравится:
class Post
def tags_used
self.tags.collect(&:name).join(',')
end
def tags_used=(list)
self.tags = list.present? ? Tag.where(:name => list.split(/\s*,\s*/)) : [ ]
end
end