2010-05-22 41 views
1

我正在爲我的應用程序添加分類功能,並正在爲此付出努力。對象通過分類有許多類別。我試圖攔截創建一個新的分類,檢查是否類似,如果是的話,增加它的數量,如果沒有,創建一個新的對象。這是迄今爲止我所擁有的。攔截新對象的創建

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

這種邏輯不應該存在於控制器中。這確實是業務領域,應該在模型中。這裏是你應該如何去做:

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將試圖找到在DB的類別,如果它不存在,它會創建它。現在只需確保計數默認爲零,並且此代碼將執行您想要的操作。 (當最初創建計數將在1,那麼以後它會增加)

PS:我不知道,如果find_or_create在軌3.已更改,但是這是主要的想法

+0

好吧。這正是我所期待的,我只是不知道該怎麼做。我真的不想把它放到任何控制器動作中,但這是一個快速解決方案。謝了哥們。 – amctammany 2010-05-22 15:22:25

+0

很高興看到聽到。如果這個答案對你有幫助,請考慮接受它。 – Faisal 2010-07-10 06:57:16

0

我決定將它從模型對象中移出並放入創建分類的控制器方法中。它現在可以工作(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