new / create ActiveRecord模型的自定义返回值

时间:2011-04-15 16:14:19

标签: ruby-on-rails-3 activerecord rails-models

所以我有一个模型(照片),当我打电话给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

1 个答案:

答案 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