所以我有一个模型(照片),当我打电话给Photo.new @image => @image
/ Photo.create :image => @image
时,我希望我的模型找到具有相同图像哈希的现有照片或者从@image创建一张新照片。假设我不能使用Photo.find_or_initialize_by_hash
,因为我有一个自定义查找功能,可以根据软图像哈希查找图像的密切副本。
我的第一个想法是做
before_validation :check_duplicates, :on => :create
def check_duplicates
self = self.find_duplicate
end
不幸的是,我意识到你不能仅仅在一个模型中重新定义自我,所以现在我认为最好的方法是做一些改变从初始化到重复的返回值的方法。
有点像这样,但它不起作用(我听说有关覆盖初始化的恐怖故事)
def initialize(*params)
super(*params)
return self.find_duplicate || self
end
答案 0 :(得分:0)
从我收集的内容来看,你的模型结构看起来像这样吗?
class Photo < ActiveRecord::Base
has_one :image
end
class Image < ActiveRecord::Base
belongs_to :photo
end
如果是这样,你可以这样做:
class Photo < ActiveRecord::Base
has_one :image, :uniq => true
end
或者如果:图片只是Photo的一个属性,你的第一个想法就在轨道上:
class Photo < ActiveRecord::Base
before_create :check_duplicate
private
def check_duplicate
Photo.where(:image => self.image).count == 0 # will be false if Photo is found
end
end
如果#check_duplicate返回false,将取消创建Photo(http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html)
或者只是
class Photo < ActiveRecord::Base
validates_uniqueness_of :image
end