将预先存在的记录与预先存在的父对象关联(2个父对象)

时间:2012-07-04 17:59:39

标签: ruby-on-rails nested-attributes associated-object

我正在使用嵌套属性中的几个模型。

我有“团队”(有许多人)和“竞赛”(属于团队)。但我也希望竞赛将“类别”作为子对象引用(竞赛只能有一个类别,一个类别可以有竞争)。

逻辑的工作方式是首先创建一个团队,然后创建一个竞赛,之后我希望能够从一个类别列表中选择(部分)并建立关联(在竞赛中设置category_id)到类别中的id值)。在创建一个新的比赛作为一个团队的孩子时,如何做到这一点是有意义的,但在创建第二个关系(现有的比赛到现有的父类别)时,我正在打击我的脑袋。

为我提供比赛节目视图的控制器是:

def show
@team = Team.find(params[:team_id])
@contest = Contest.find(params[:id])
@categories = Category.all

respond_to do |format|
  format.html # show.html.erb
  format.json { render json: [@contest] }
end

在show视图中我有这段代码:

<p><b>Name:</b><%= @contest.name %></p>
<%= link_to 'Edit', edit_team_contest_path(@team, @contest) %> |
<%= link_to 'Back', team_contests_path %>
<br />
<%= render 'categories/index'%>

我的部分类别_index包含以下代码:

<table>
<% @categories.each do |category| %>
<tr>
<td><%= category.level1 %></td>
<td><%= category.level2 %></td>
<td><%= category.level3 %></td>
<td><%= category.level4 %></td>    
<td><%= link_to 'Show', category %></td>
<td><%= link_to 'Edit', edit_category_path(category) %></td>
<td><%= link_to 'Destroy', category, confirm: 'Are you sure?', method: :delete %></td>
<%end%>
</table>

我感到很沮丧的地方是在哪里放置代码(在比赛或类别控制器中?)来设置类别 - 比赛亲子关系,以及哪个视图(比赛节目视图或类别_index部分) ?)。我很确定我在这里不了解Rails的基本内容,所以如果有人能指出我可能清理我的困惑的文档,我会非常感激。

1 个答案:

答案 0 :(得分:1)

好的,这就是我最终解决问题的方法(如果以后有人发现并使用我尝试过的相同搜索字词):

型号:

team.rb
 has_many :contests, :dependent => :destroy

category.rb
 has_many :contests

contest.rb
 belongs_to :team, :foreign_key => "team_id"
 belongs_to  :category, :class_name => 'Category', :foreign_key =>"category_id"
 accepts_nested_attributes_for :category

控制器:

contests_controller
def update
@contest = Contest.find(params[:id])
@team = @contest.team
if !params[:category_id].nil?
  @category = Category.find(params[:category_id]) 
  @contest.update_attributes(:category_id => @category.id)
end
respond_to do |format|
  if @contest.update_attributes(params[:contest])
   blah
  else
    blah
  end
end
end

分类视图(_index),在竞赛/节目视图中的一部分,包括以下三位代码:

<table>
<% @categories.each do |category| %>
<tr>
<td><%= form_for [category, @contest] do |f| %>
    <% f.submit "Select" %>
    <% end %></td>
</tr>
<%end%>
</table>

这就是将属于另一个父级的记录与另一个父级中的另一个父级关联所需的内容(在创建第一个关系之后)。