2011-04-15 58 views
0

所以我有一个模型(照片),当我打电话Photo.new @image => @image/Photo.create :image => @image时,我想让我的模型找到具有相同图像散列的现有照片,或者从@图片。假设我不能使用Photo.find_or_initialize_by_hash,因为我有一个自定义查找功能,可以根据软图像散列查找图像的密切副本。新/创建ActiveRecord模型的自定义返回值

我的第一个想法是做

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

这将在Objective-C的工作,而不是在Ruby的:)恕我直言,你最好的镜头是重新定义Photo.find_or_initialize_by_hash方法。 – Roman 2011-04-15 16:26:59

回答

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 

或者,如果:图像只是照片的属性,你的第一个想法是在轨道:

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,则创建照片(http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html)

或者干脆

class Photo < ActiveRecord::Base 
    validates_uniqueness_of :image 
end 
+0

不幸的是,图像是照片的虚拟属性(回形针附件)。 Photo.find_duplicate基本上是Photo.where(“BIT_COUNT(phash ^?)<=?”,phash,15)。它允许我搜索图像的重复副本(略有不同的分辨率/裁剪/格式等) – 2011-04-16 17:00:43