Перехват создания нового объекта - PullRequest
1 голос
/ 22 мая 2010

Я добавляю функцию категоризации в свое приложение и борюсь с ней. У объектов есть много категорий через категоризацию. Я пытаюсь перехватить создание новой классификации, проверить, есть ли подобная, если да, увеличить ее счет, если нет, создать новый объект. Вот что у меня есть.

  validate :check_unique

  protected

  def check_unique
    categorization = Categorization.where(:category_id => self.category_id, :categorizable_id => self.categorizable_id, :categorizable_type => self.categorizable_type)
    if categorization.first
      categorization.first.increment(:count)
    end
  end

Ответы [ 2 ]

2 голосов
/ 22 мая 2010

Такая логика не должна существовать в контроллере. Это действительно бизнес сфера и должна быть в модели. Вот как вы должны это сделать:

categorization = Categorization.find_or_create_by_category_id_and_categorizable_id_and_categorizable_type(self.category_id, self.categorizable_id, self.categorizable_type)
categorization.increment!(:count)

find_or_create попытается найти категорию в БД, и, если она не существует, она создаст ее. Теперь просто убедитесь, что значение по умолчанию равно нулю, и этот код будет делать то, что вы хотите. (при первоначальном создании счет будет равен 1, а затем будет увеличиваться)

PS: я не уверен, изменился ли find_or_create в rails 3. Но это основная идея

0 голосов
/ 22 мая 2010

Я решил убрать его из объекта модели и поместить в метод контроллера, создав классификацию. Теперь это работает (Yay!) И вот код, если кому-то интересно.

  def add_tag
    object = params[:controller].classify.constantize
    @item = object.find(params[:id])
    @categories = Category.find(params[:category_ids]) 
    @categories.each do |c|
      categorization = @item.categorizations.find(:first, :conditions => "category_id = #{c.id}")
      if categorization
        categorization.increment!(:count)
      else
        @item.categorizations.create(:category_id => c.id, :user_id => current_user.id)
      end
    end
    if @item.save
    current_user.update_attribute(:points, current_user.points + 15) unless @item.categorizations.exists?(:user_id => current_user.id)
      flash[:notice] = "Categories added"
      redirect_to @item
    else
      flash[:notice] = "Error"
      redirect_to 'categorize'
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...