2010-07-19 75 views
0

现在我有这样的社交媒体应用程序,在那里我对每个类别的用户在实施评级里面更新,我想要做什么:Rails的自定义功能编辑:从控制器

每当用户投下一票在一篇文章中,它将抓住文章上的所有投票并作出评分/投票的平均值,并将该值插入到另一个模型中(用户类别评级),现在我的问题是,是否有某种方式实际上可以做的功能,只是在控制器内调用它的投票创建函数?另外,通过纯SQL还是有一种“rubyish”方式,完成平均的最佳方式是什么?

如果你们中的任何一个人需要更多的细节,我会很乐意为他们提供,感谢您的一切帮助。

编辑

现在它插入第一次,但不会更新,也许我需要另一种方法,这是我在控制现在。

def create 
    @vote = Vote.new(params[:vote]) 
    @user_rating = UserCategoryRating.new 
    @vote.user_id = current_user.id 

    @article = Article.find(@vote.article_id) 
    @user_rating.category_id = @article.category_id 
    @user_rating.user_id = @article.user_id 
    @user_rating.rating = @article.votes.average('value') 

    if @vote.save 
    @user_rating.save 
    flash[:notice] = "Your vote has been sumbmitted sucessfully" 
    redirect_to :controller => :articles 
    else 
    flash[:error] = "You have already voted for this article!" 
    redirect_to :controller => :articles 
    end 
end 

这已正确设置第一选票,但在此之后,它是不更新,也许我需要验证是否存在票应该更新,但我怎么做到这一点?

乔希

回答

2

可以使用活动记录计算计算平均值:

average(column_name, options = {})

您创建操作过程中只需调用该函数。

+0

这可行,但有一个小问题,它不会更新。我将编辑我的问题,以查看问题。 – Gotjosh 2010-07-20 13:02:12

+1

如果你只是在创建动作中调用它,那么是的,它只会在插入新记录时发生。如果你想在它之后更新,那么你应该把它放在你的“更新”方法中(如果你使用脚手架,它应该在那里,否则只需要一个名为update的方法来更新你想更新的值)。 – sosborn 2010-07-21 00:13:28

+1

真正的问题是,我把条件放在哪里,如果用户已经对这个类别投票更新,如果不创建? – Gotjosh 2010-07-28 17:48:43