2013-05-04 2 views
3

Допустим, у нас есть две модели с многие ко многим соотношением:DataMapper Многие-ко-многим Удалить Constraint

class Tag 
    include DataMapper::Resource 
    property :id, Serial 
    has n, :articles, through: Resource 
end 

class Article 
    include DataMapper::Resource 
    property :id, Serial 
    has n, :tags, through: Resource 
end 

Теперь, если я создаю статью с тегом: Tag.create(articles: [ Article.create ])

Если я запустите Tag.first.delete, он возвращает false, поскольку существует ограничение внешнего ключа из-за отношения «многие ко многим». Если я запустил Tag.first.delete!, он удалит тег, но не запись ассоциации в таблице article_tags.

Если я использую dm-contraints и устанавливаю все на :destroy, он также разрушает статью, которая не то, что я хочу.

я могу сделать

tag = Tag.first 
tag.articles = [] 
tag.save 
tag.destroy 

, но это, кажется, кажется нечистым. Есть ли способ лучше?

+0

xato, вы нашли лучший способ? – fernandospr

ответ

2

С Tag и Article связаны через отношения «многие ко многим», вам нужно сначала уничтожить любую модель объединения «ArticleTag», которая ссылается на объект, который вы пытаетесь удалить.

#get the tag to delete 
tag = Tag.first 

#deletes all rows in the article_tags table that reference 
#the tag you want to delete 
ArticleTag.all(:tag => tag).destroy 

#an alternative to the line above--it does the same thing 
tag.article_tags.all.destroy 

#another alternative--it won't delete the articles only 
#the join model that references the tag 
tag.articles.all.destroy 

#finally, obliterate the tag 
tag.destroy