Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails自定义函数编辑:从控制器内部更新_Ruby On Rails_Activerecord_Function - Fatal编程技术网

Ruby on rails Rails自定义函数编辑:从控制器内部更新

Ruby on rails Rails自定义函数编辑:从控制器内部更新,ruby-on-rails,activerecord,function,Ruby On Rails,Activerecord,Function,现在我有了这个社交媒体应用程序,我在其中对每个类别的用户进行评级,我想做的是: 每当用户对一篇文章进行投票时,它都会获取文章的所有投票,并对分数/投票进行平均,然后将该值插入我拥有的另一个模型(用户类别评级),现在我的问题是,是否有某种方法可以让我实际生成函数,然后在控制器内部调用它,以便对create函数进行表决?另外,通过纯SQL或“rubysh”方式实现平均值的最佳方式是什么 如果你们中有人需要更多的细节,我很乐意提供,谢谢你们一如既往的帮助 编辑 现在它第一次插入,但不会更新,也许我需要

现在我有了这个社交媒体应用程序,我在其中对每个类别的用户进行评级,我想做的是:

每当用户对一篇文章进行投票时,它都会获取文章的所有投票,并对分数/投票进行平均,然后将该值插入我拥有的另一个模型(用户类别评级),现在我的问题是,是否有某种方法可以让我实际生成函数,然后在控制器内部调用它,以便对create函数进行表决?另外,通过纯SQL或“rubysh”方式实现平均值的最佳方式是什么

如果你们中有人需要更多的细节,我很乐意提供,谢谢你们一如既往的帮助

编辑

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

 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
这是正确地设置第一次投票,但是在那之后,它不是在更新吗?也许我需要验证,如果投票存在,它应该更新,但是我如何实现这一点


Josh

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


只需在创建操作期间调用该函数。

这是可行的,但有一个小问题,它不会更新。我将编辑我的问题,以查看问题。如果您仅在“创建”操作中调用此选项,则是,仅当您插入新记录时才会发生。如果你想在那之后更新它,那么你应该把它放在你的“更新”方法中(如果你使用脚手架,它应该在那里,否则只需要做一个名为update的方法来更新你想要更新的值)。真正的问题是,如果用户已对此类别进行了投票,则更新,如果未创建,则将条件放在何处?您可以测试对象是否已存在:if Vote.exists?(参数[:Vote]))