我有一个Post模型,我创建了迁移AddTotalVotesToPosts
以将列total_votes
添加到表posts
中。我有以下代码:
@post.total_votes=@post.votes.sum(:vote)
我的问题是如何将这些数据添加到Post表中? 请知道我是初学者,我仍然很难理解Rails。
答案 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)")