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 に答える