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. ユーザーが特定のレポートに投票した場合はtrue/false

今のところ、ActiveRecordクエリの基本的な理解は、レポートと現在のヘルパーuserを作成することと、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 %>

ヘルパー

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? という名前を付けることを検討してください。hasVoted の代わりに。次に、そのメソッドをユーザー モデルに移動することを検討してください。

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

ビューは次のように表示されます

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

もう 1 つの質問は、レポートが受け取った投票数を調べることでした。これも簡単です。@reports を反復処理するループ内のビューでこれを行うことができます

<% vote_count = report.votes.size %>

これにより、N 個のクエリが生成されることに注意してください (N = レポートの数)。あなたはRailsを初めて使用するので、コントローラーでレポートクエリを複雑にして、投票数を含めるためにレポートを取得するつもりはありません(あなたが私に頼まない限り)。しかし、ここで起こっていることに慣れたら、そこを最適化します。

于 2012-07-31T06:04:50.740 に答える