我有3张桌子:超级英雄,权力,团队
超级英雄可以拥有许多权力和许多团队。
例如:
superhero.rb
name:string
has_many :power_teams, :dependent => :destroy
has_many :powers, :through => :power_teams, :foreign_key => :power_id
has_many :teams, :through => :power_teams, :foreign_key => :team_id
power.rb
name:string
has_many :power_teams, :dependent => :destroy
team.rb
name:string
has_many :power_teams, :dependent => :destroy
#This is what I want to add to
power_team
belongs_to :superhero
belongs_to :power
belongs_to :team
更新这里是超级英雄的控制器
def create
@hero = Superhero.new(params[:hero])
形式:
<%= form_for(@hero) do |f| %>
<%= f.label :name %><br />
<%= f.text_field :name %>
#Teams are a drop-down, you can only choose 1 team
<%= f.collection_select(:team_ids, Team.all(:order=>:name), :id, :name, {:prompt => true}) %>
#powers are checkboxes, you can choose multiple powers
<% Power.all.each do |power| %>
<label class="checkbox">
<%= check_box_tag "superhero[power_ids][]", power.id, @hero.power_ids.include?(power.id) %>
<%= power.name %>
</label>
<% end %>
<% end %>
当我保存时,1个团队和2个权力我得到了这个(在索引页面中):
Hero | Power | Team
1 1
1 2
1 1
这是对的吗?我以为我会看到并期待这个:
Hero | Power | Team
1 1 1
1 2 1
答案 0 :(得分:0)
你说你想在权力和团队之间建立一种关系,而power_team目前只有一个权力宣告关联。如果你在power_teams表上有team_id,那么你也应该在power_team模型中有这个:
belongs_to :team
这可能不是唯一的问题。由于您仅部分定义了模型,未定义模式,并且未提供用于尝试更新的表单等的代码,因此很难说清楚。
确保在每个模型中都设置了关联的关联,并且关联的定义匹配。如果belongs_to在模型表中有外键列,则使用belongs_to;如果是具有为此模型定义的外键列的关联模型表,则使用has_one / has_many(取决于您希望返回的记录数);或者has_and_belongs_to_many(又名“HABTM”)如果你有一个只有 有两列的连接表 - 一个用于它加入的两个表的每个外键。看起来你已经完成了少数的依赖性破坏,所以不必提及。如果要与旧模式集成,那么如果在关联的任一侧使用非标准表名,非标准连接表名,非标准外键列名和/或ID,或非标准模型类名,然后您需要为关联的两侧正确设置关联的其他选项。
即使您在评论中注意到质量分配安全性不是问题,但请确保如果您希望更新关联对象(并假设您使用Rails 3.1+具有质量分配安全性和白名单,这是最新的默认值3.2.x)您要将_attributes
添加到attr_accessible
中定义的属性名称的末尾,以获取您接受嵌套属性的内容。在Rails 4中,质量分配安全性正在消失,所以如果您对使用strong_parameters感兴趣,那么这将是研究其他新Rails 4技术(rails-api,ActiveModel :: Serializers等)的好时机。目前可以在Rails 3中使用。
更新
由于问题已更新,我现在看到超级英雄与power_teams有关联,反之亦然。超级英雄或power_team中没有必要使用该关联,因此我将其删除。在问题中控制器似乎仍然存在一些丢失的代码,因为它应该在加载创建表单时路由到“新”操作方法,并且用于接受表单提交的“创建”操作方法,所以那里至少应该有两种叫做“新”和“创造”的方法。启动一个新项目并使用rails生成脚手架方法来获得最初的东西,这是一个好主意,因为你已经拥有架构(我刚才提到的更改是为了删除power_team的超级英雄关联,反之亦然) 。我知道你不是基于其他问题对Rails不熟悉的,但是以基线为例总是好的:http://guides.rubyonrails.org/getting_started.html