2011-04-15 61 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