Rails 3通过另一个控制器中的连接模型访问has_many

时间:2012-06-26 05:42:52

标签: ruby-on-rails ruby-on-rails-3 has-many-through

我正在做一个在线评判应用程序,所以我有一个用户模型,一个问题模型和一个解决方案模型来建立多对多关系。在该解决方案模型中,我有一个名为“state”的额外列,我计划为某个用户存储问题的状态:已解决,错误的anwser,未解决。

我正在尝试修改我的问题控制器中的索引操作,以在问题列表中呈现问题的状态(这样用户就可以看到他是否已经解决了问题,就像我之前说过的那样)。然而,当我访问视图时,我有一个“未初始化的常量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并因为额外的列而更改了它。我已经阅读了很多关于多对多关系的内容,但我无法理解这种情况=(

1 个答案:

答案 0 :(得分:0)

只需要使用:

problem.solution.state

除非问题可能有很多解决方案,否则它需要像:

problem.solutions.first.state

然而,这只会给出第一个的状态,所以我在Problem中定义了一个计算状态的方法(例如,如果任何解决方案解决了它,那么问题就解决了)

对于1个问题,给定用户的许多解决方案。 在Solution.rb中

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

然后我们可以致电:

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

它可能看起来有点长,但它非常灵活。