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
我很感谢您花时间帮助我。
丹
这是正确的。谢谢。我的问题还在于,我通过一个关联调用.delete,即@ command.tags.delete(tag),而不是使用.destroy,即@ command.tagmapsorters.find_by(tag_id:params [:tag_id])。destroy。删除不会触发回调。 – dps
@dps - 只需用'destroy'代替'delete'(例如'@ command.tags.destroy(tag)')即可。否则,你不需要改变你的语法。 – PinnyM