2014-01-22 63 views
1

我有一个新手rails问题。我试图通过HABTM关系确定一个模型至少有一个关联。基本上我已经创建了以下验证:删除HABTM协会的验证:

validate :has_tags? 
def has_tags? 
    errors.add(:base, 'Must have at least one tag.') if self.tags.blank? 
end 

这在我创建新记录时正常工作。问题是,当我把模型,并尝试取消关联,做这样的事情:

tag = Tag.find(params[:tag_id])$ 
@command.tags.delete(tag)$ 

这是允许的,即该协会将被删除。根据我对HABTM关联(http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association)的阅读,如果需要验证,回调或加入模型的额外属性,我应该“使用has_many:through。”。

我想我的问题是如何对关联的.delete方法执行验证。我应该在调用delete时手动执行此操作(即,在执行删除之前运行单独的联接来计算关联的数量),还是在删除时使用验证模型的方法?这里是我的型号:

class Command < ActiveRecord::Base 
    has_many :tagmapsorters 
    has_many :tags, through: :tagmapsorters 
    validates :text, presence: true 
    validates :description, presence: true 
    validates :text, uniqueness: true 
    validate :has_tags? 
    def has_tags? 
    errors.add(:base, 'Must have at least one tag.') if self.tags.blank? 
    end 
end 

我很感谢您花时间帮助我。

回答

1

,你需要的任何回调应该被注册为联接模型Tagmapsorterbefore_destroy(用于验证)或after_destroy(用于清理),因为这是实际被销毁的记录。

+0

这是正确的。谢谢。我的问题还在于,我通过一个关联调用.delete,即@ command.tags.delete(tag),而不是使用.destroy,即@ command.tagmapsorters.find_by(tag_id:params [:tag_id])。destroy。删除不会触发回调。 – dps

+0

@dps - 只需用'destroy'代替'delete'(例如'@ command.tags.destroy(tag)')即可。否则,你不需要改变你的语法。 – PinnyM