我正在做一个在线评判应用程序,所以我有一个用户模型,一个问题模型和一个解决方案模型来建立多对多关系。在该解决方案模型中,我有一个名为“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并因为额外的列而更改了它。我已经阅读了很多关于多对多关系的内容,但我无法理解这种情况=(
答案 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
它可能看起来有点长,但它非常灵活。