我正在为我的应用添加分类功能并努力解决它。对象通过分类有许多类别。我试图拦截新分类的创建,检查是否有类似的,如果是,增加它的计数,如果没有,创建一个新对象。这是我到目前为止所拥有的。
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
答案 0 :(得分: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将尝试在数据库中找到该类别,如果它不存在,它将创建它。现在只需确保count默认为零,此代码将执行您想要的操作。 (当最初创建时,计数将为1,然后它将增加)
PS:我不确定find_or_create是否在rails 3中发生了变化。但这是主要想法
答案 1 :(得分:0)
我决定将其移出模型对象,并将其放入创建分类的控制器方法中。它现在有效(耶!),如果有人有兴趣,这里是代码。
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