Пользовательское возвращаемое значение для новой / создания модели ActiveRecord - PullRequest
0 голосов
/ 15 апреля 2011

Итак, у меня есть модель (Фото), где, когда я звоню 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 голосов
/ 16 апреля 2011

Насколько я понимаю, ваша модель структуры выглядит примерно так?

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
...