Activerecord关系加入

时间:2012-07-31 05:54:17

标签: ruby-on-rails activerecord

我正在使用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. 如果用户已对特定报告投票,则为真/假
  3. 现在,我对ActiveRecord查询的基本理解只需要我使用报告和当前user创建帮助,而不是查询{{1}的存在}

    同样可以计算report所有用户的总投票数,如下所示:

    控制器

    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 %>
    

    希望能为您提供一些帮助......谢谢!

1 个答案:

答案 0 :(得分:1)

不确定

首先,请考虑命名你的方法has_voted?而不是hasVoted。其次,考虑在用户模型中移动该方法。

#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的新手,我不会在您获取报告的控制器中使报告复杂化,以包括投票计数(除非您要求我)。但是一旦你对这里发生的事情感到满意,那就是你要优化的地方。