0

私はオンライン審査員の申請を行っているので、多対多の関係を作るための User モデル、Problem モデル、Solution モデルがあります。そのソリューション モデルには、特定のユーザーの問題の状態 (解決済み、間違った答え、未解決) を保存する「状態」という追加の列があります。

問題コントローラーの index アクションを変更して、問題の状態を問題リストに表示しようとしています (前に述べたように、ユーザーは問題を解決したかどうかを確認できます)。それにもかかわらず、ビューにアクセスすると、「初期化されていない定数 Admin::ProblemsController::Solution」エラーが発生します。

私は RoR を初めて使用し、これまでの経験は非常に厳しいものでした。コントローラーとビューのコードは次のとおりです。

problems_controller.rb

def index
  @problems = Problem.all
    if current_user
      @solutions = Solution.includes(:problem).where(:user_id => current_user.id)
  end

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @problems }
  end
end

ビュー/問題/index.html.erb

<% @problems.each do |problem| %>
  <tr>
    <td><%= problem.name %></td>
    <td><%= problem.code %></td>
    <td><%= problem.description %></td>
    <% if current_user %>
      <%= for solution in @solutions do %>
        <% if solution %>
          <td><%= solution.state%></td>
        <% else %>
          <td>Not Solved</td>
        <% end %>
      <% end %>
    <% end %>
    <td><%= link_to 'Show', problem %></td>
    <% if current_user && current_user.is_admin? %>
    <td><%= link_to 'Edit', edit_problem_path(problem) %></td>
    <td><%= link_to 'Delete', problem, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    <% end %>
  </tr>
<% end %>

それが Solutions テーブルにアクセスする最善の方法なのか、それとも別のコントローラーでそれを行うべきなのか (ユーザーコントローラーで? おそらくソリューションコントローラーファイルで?) はわかりません。

その「ソリューション」結合テーブルの使用方法を明確にしたいと思います。以前に has_and_belongs_to_many があり、余分な列のために変更しました。私は多対多の関係についてたくさん読んだことがありますが、この場合は理解できません =(

4

1 に答える 1

0

使用するだけです:

problem.solution.state

問題に多くの解決策がある場合を除き、次のようなものにする必要があります。

problem.solutions.first.state

ただし、これは最初の状態を与えるだけなので、問題でステータスを計算するメソッドを定義します (たとえば、解決策のいずれかがそれを解決する場合、問題は解決されます)。

1 つの問題に対して、特定のユーザーに対する多くのソリューション。Solution.rb内

scope :for_user, lambda {|user_id| :conditions => {:user_id => user_id}}

次に、次を呼び出すことができます。

problem.solutions.for_user(current_user.id).first.state

少し長く見えるかもしれませんが、非常に柔軟です。

于 2012-06-26T05:53:54.517 に答える