0

我正在使用 Rails 和 Activerecord 并尝试在我的视图中将相关表中的一些数据合并在一起,这是我的模型:

class Report < ActiveRecord::Base
  has_many :votes
end

class Vote < ActiveRecord::Base
  belongs_to :reports
end

class User < ActiveRecord::Base
  has_many :votes
end

每个投票都有一个用户和一个报告。

在我看来,我需要以下内容,希望尽可能简单:

  1. 所有用户对每个报告的总投票数
  2. 如果用户对特定报告进行了投票,则为真/假

现在,我对 ActiveRecord 查询的基本理解只需要我为报告和当前创建一个助手user,而不是查询是否存在report

计算 a 的所有用户的总票数也是report如此:

控制器

def index
  #this is where I need some help to get the related information into a single
  #object
  @reports = Report.where('...')
end

看法

<% @reports.each do |report| %>
    <% if(hasVoted(@current_user.id, report.id)) %>
        <!-- display the 'has voted html' -->
    <% end %>
<% end %>

帮手

def hasVoted(current_user_id, report_id)
    if(Vote.exists?(:user_id => current_user_id, :report_id => report_id))
      true
    else
      false
    end      
end

希望这能让您对帮助有所了解……谢谢!

4

1 回答 1

1

当然。

首先,请考虑将您的方法命名为 has_voted?而不是已投票。其次,考虑在用户模型中移动该方法。

#user.rb
def voted_on?(report_id)
  votes.where(:report_id => report_id).exists?
end

然后您的视图将读取

<% if current_user.voted_on?(report) %>
  ...
<% end %>

您遇到的另一个问题是找出报告收到的票数。这也很简单。您可以在循环内的视图中执行此操作,在该循环中迭代 @reports

<% vote_count = report.votes.size %>

请记住,他会导致 N 个查询(其中 N = 报告数)。由于您是 Rails 新手,因此我不会在控制器中使您的 Reports 查询复杂化,您可以在控制器中获取报告以包括投票计数(除非您要求我这样做)。但是,一旦您对这里发生的事情感到满意,那就是您要优化的地方。

于 2012-07-31T06:04:50.740 回答