在Rails5中如何将数据添加到没有表单的模型中?

时间:2018-03-27 15:05:08

标签: ruby-on-rails

我有一个Post模型,我创建了迁移AddTotalVotesToPosts以将列total_votes添加到表posts中。我有以下代码:

@post.total_votes=@post.votes.sum(:vote)

我的问题是如何将这些数据添加到Post表中? 请知道我是初学者,我仍然很难理解Rails。

3 个答案:

答案 0 :(得分:1)

我建议对你的Vote模型使用counter_cache。

class Vote
   belongs_to :post, counter_cache: :total_votes
end

这将在创建或删除新投票时自动更新特定帖子的total_votes

如果您在添加total_votes列之前已经为某些帖子投了票,那么您可以按以下方式重置帖子的计数器:

Post.find_each { |post| Post.reset_counters(post.id, :comments) }

答案 1 :(得分:0)

看起来您可能忽略了保存更改。在致电您的代码以设置总投票数后,请致电@post.save。这实际上会在表格中记录这些变化。

答案 2 :(得分:0)

这听起来像你想要的是association callback在添加记录时触发:

class Post < ApplicationRecord
  has_many :votes, after_add: :update_total_votes

  def update_total_votes(new_vote)
    self.class.where(id: id).update_all(
      "total_votes = (SELECT sum(votes.vote) FROM votes WHERE votes.post_id = posts.id)"
    )
  end
end

在创建投票后,使用以下查询更新帖子:

UPDATE "posts" SET total_votes = (SELECT sum(votes.vote) FROM votes WHERE votes.post_id = posts.id) WHERE "posts"."id" = $1  [["id", 1]]

您可以通过删除WHERE子句来更新所有记录:

Post.update_all("total_votes = (SELECT sum(votes.vote) FROM votes WHERE votes.post_id = posts.id)")