ActiveRecord回调期间的验证

3
在 Ruby 中,是否可以在 `before_save` 回调中创建相关模型的新实例时执行验证?
class Podcast < ActiveRecord::Base
has_many :tracks, :dependent=>:destroy

before_save :generate_tracks

# creates the tracks played in the podcast 
def generate_tracks
    json = Hashie::Mash.new HTTParty.get("#{self.json_url}")
    json.sections.each do |section|
      if section.section_type=="track"
        track = self.tracks.build :name=>section.track.name
      end
    end
  end
end 

上面的代码运行良好,但我希望在if语句中添加类似于这样的内容:
unless track.valid?
  errors[:base] << "OOPS, something went wrong whilst trying to build tracklist."
  return false
end

此代码的问题在于,track.valid? 总是返回 false,因为 Track 模型验证了 podcast_id 的存在。我不太想在 after_create 回调函数中这样做,因为如果 tracklist 无法通过验证,我实际上希望取消 podcast 的创建。那么我该怎么办?

在 Inside Track 模型中,我们可以通过绕过验证来做类似这样的事情:def valid? true end - Rajkamal Subramanian
我宁愿不绕过验证,而是更愿意删除构建曲目列表的代码。 :) - stephenmurdoch
1个回答

2
听起来你需要的是validates_associated,这可以让你实现以下功能:
class Podcast < ActiveRecord::Base
  has_many :tracks

  validates_associated :tracks
end

这样,只有当关联的曲目有效时,播客才会保存。


简直不敢相信我之前不知道这个!我应该更好地阅读手册。谢谢,这基本上可以工作了,尽管我必须在曲目模型中删除对播客ID的验证才能使其正常工作。我认为这没问题。非常感谢。 - stephenmurdoch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接