Search
Write a publication
Pull to refresh

Datamapper many_to_many relationship update

Reading time2 min
Views1.2K
Однажды при использовании Datamapper столкнулся с задачей обновления коллекции отношений many_to_many, перерыл множество источников, но толкового объяснение так и не нашел. Хочу представить мое решение.


Итак, у нас есть 2 объекта — Статья (Article) и Категория (Category). Одна Статья может принадлежать разным Категориям и одна Категория может содержать несколько Статей. Сразу создадим несколько Категорий.
class Article
  include DataMapper::Resource

  property :id, Serial
  property :name, String

  has n, :categories, :through => Resource
end

class Category
  include DataMapper::Resource

  property :id, Serial
  property :name, String

  has n, :articles, :through => Resource
end

category_d = Category.new
category_d.name = "Действующие актеры"
category_d.save

category_f = Category.new
category_f.name = "Французы"
category_f.save

category_v = Category.new
category_v.name = "Виноделы"
category_v.save

category_r = Category.new
category_r.name = "Россияне"
category_r.save


Мы решили создать Статью «Жерар Депардье» и решили что она может лежать в нескольких Категориях — «Действующие актеры», «Французы»

article  = Article.new
article.name = "Жерар Депардье"
article.save

category_d = Category.first(:name => "Действующие актеры")
category_f = Category.first(:name => "Французы")

article.categories << category_d
article.categories << category_f
article.save


Спустя некоторое время мы решили внести изменения — удалить Статью из Категории «Действующие актеры», добавить в Категорию «Виноделы», и добавить в Категорию «Россияне».
И вот тут происходит самое интересное потому, что можно сделать как описано в документации — вручную удалять связи ненужные и добавлять новые, а можно сделать гораздо проще — просто присвоить массив необходимых связей.
article = Article.first(:name => "Жерар Депардье")

category_v = Category.first(:name => "Виноделы")
category_r = Category.first(:name => "Россияне")
category_f = Category.first(:name => "Французы")

article.categories = [category_v, category_r, category_f]
article.save


Надеюсь что мое объяснение будет полезным, а если кто знает вариант проще — прошу рассказать в комментариях.
Tags:
Hubs:
Rating0
Comments0

Articles