0

我有 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
4

1 回答 1

0

您说要在权力和团队之间建立关系,而 power_team 目前只有一个声明为权力的关联。如果你在 power_teams 表上有 team_id,那么你应该在 power_team 模型中也有这个:

belongs_to :team

这可能不是唯一的问题。很难说清楚,因为您仅部分定义了模型,没有定义您的架构,也没有提供您用来尝试更新的表单的代码等。

确保您在每个模型中都设置了两种方式的关联,并且关联的定义匹配。如果模型表中有外键列,则使用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 中使用。

更新:

由于问题已更新,我现在看到 superhero 与 power_teams 有关联,反之亦然。在 superhero 或 power_team 中,该关联不是必需的,因此我将其删除。问题中的控制器似乎仍然缺少一些代码,因为它应该在加载创建表单时路由到“新”操作方法,并路由到接受表单提交的“创建”操作方法,所以有应该至少有两个方法叫做“new”和“create”。开始一个新项目并使用 rails generate scaffold 方法来获取初始内容可能是个好主意,因为您已经拥有了直接的架构(我刚才提到的更改是删除与 power_team 的超级英雄关联,反之亦然) . 根据其他问题,我知道您对 Rails 并不陌生,http://guides.rubyonrails.org/getting_started.html

于 2013-02-01T16:43:42.940 回答