Ruby on rails Rails关联记录计数内部视图

Ruby on rails Rails关联记录计数内部视图,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有两个模型,故事和投票。我有一个文章列表,用户可以向上投票,它作为单独的投票存储在投票模型中 故事模型有许多投票,故事id与投票记录一起存储 目前,在我对故事视图的索引操作中,我只是想做一个简单的计数,看看一个给定故事有多少选票,我用下面的代码实现了这一点 <%= @total_votes = Vote.where(:story_id => story.id).count %> story.id).计数%> 但是,我想从我的故事索引操作视图中删除它,但不确定是否要存储它?

我有两个模型,故事和投票。我有一个文章列表,用户可以向上投票,它作为单独的投票存储在投票模型中

故事模型有许多投票,故事id与投票记录一起存储

目前,在我对故事视图的索引操作中,我只是想做一个简单的计数,看看一个给定故事有多少选票,我用下面的代码实现了这一点

<%= @total_votes = Vote.where(:story_id => story.id).count %>
story.id).计数%>

但是,我想从我的故事索引操作视图中删除它,但不确定是否要存储它?有更有效的方法吗?

这应该放在控制器中

def index
  @total_votes = Vote.where(:story_id => story.id).count
end

在模型内部,您可以定义一个方法并在控制器中使用它

def total_votes(sid)
  where(:story_id => sid ).count
end
然后在控制器中:

@total_votes = Vote.total_votes(story_id)

您说过要存储总票数值:

$~ rails g migration add_total_votes_to_stories total_votes:integer

class Story
  after_save, :update_total_votes

  private

  def update_total_votes
    write_attribute :total_votes, votes.count
  end

似乎这段关系是一个有很多选票的故事。因此,您可以简单地执行以下操作:

<%= story.votes.count %>


如果您担心数据库性能,您可能需要添加一个。

刚刚看到这一个,非常简单。这对数据库会更好吗?不,如果你担心你必须使用。就效率而言,这与另一个答案完全相同。我只是觉得制作一个额外的实例方法是胡说八道。@Misha,你是对的,这就是为什么我删除了我的答案:没有必要让它,因为我认为你的答案是好的:+1:)谢谢,@siekfried+请发表评论:-)@Misha:当你假设两种模式都有关系时,你可能是对的。但是这个问题没有提到任何地方——甚至没有任何提示,所以我认为通用方法更合适。有一个小提示表明投票属于故事,即投票表有一个
story\u id
列。如果模型中没有建立这种关系,IMO的正确答案是建议建立这种关系,而不是你所建议的“变通办法”。(顺便说一句,现在我再看一遍,它是不正确的。它应该是:
def self.total_voces(sid)
)这是正确的。同意。感谢您指出=>def self.total_voces(sid)