0

所以我有一个模型(照片),当我调用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

不幸的是,我意识到你不能只在模型中重新定义 self,所以现在我认为最好的方法是按照将返回值从初始化更改为副本的方式来做一些事情。

有点像这样,但它不起作用(我听说过关于覆盖初始化的恐怖故事)

def initialize(*params)
super(*params)
return self.find_duplicate || self
end
4

1 回答 1

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

或者,如果 :image 只是 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 (http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html),这将取消创建照片

或者干脆

class Photo < ActiveRecord::Base
  validates_uniqueness_of :image
end
于 2011-04-15T23:58:54.140 回答