在删除时验证HABTM关联:

时间:2014-01-22 02:24:24

标签: ruby-on-rails ruby validation

我有一个新手铁路问题。我正在尝试通过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:如果你需要验证,回调或连接模型上的额外属性。”

我想我的问题是如何对.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 个答案:

答案 0 :(得分:1)

您需要的任何回调都应该在连接模型before_destroy上注册为after_destroy(用于验证)或Tagmapsorter(用于清除),因为这是实际存在的记录破坏。