Ruby on rails 3 rails 3从不同的控制器更新模型

Ruby on rails 3 rails 3从不同的控制器更新模型,ruby-on-rails-3,forms,model-view-controller,Ruby On Rails 3,Forms,Model View Controller,我有三张桌子:超级英雄,超级力量,团队 一个超级英雄可以拥有很多力量和团队 例如: 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, :f

我有三张桌子:超级英雄,超级力量,团队

一个超级英雄可以拥有很多力量和团队

例如:

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])
表格:

是这样吗?我想我会看到并期待着:

Hero | Power | Team
  1      1       1
  1      2       1

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

belongs_to :team
这可能不是唯一的问题。很难判断,因为您只定义了部分模型,没有定义模式,也没有提供用于尝试更新的表单等的代码

确保在每个模型中都设置了关联,并且关联的定义匹配。如果模型的表中有外键列,则使用“属于”,如果关联模型的表中定义了外键列,则使用“有一个/有多个”(取决于您希望返回的记录数),或者如果关联模型的表中有“和”属于“多个”(也称为“HABTM”)如果您有一个联接表,该联接表只有两列—它联接的两个表的每个外键对应一列。看起来你已经做了一些依赖销毁,所以不必提及。如果要与旧模式集成,那么如果要在关联的任一侧使用非标准表名、非标准联接表名、非标准外键列名和/或ID或非标准模型类名,然后,您需要为关联的双方正确设置关联的其他选项

尽管您在评论中指出,批量分配安全性不是问题,但如果您希望更新关联对象,请确保(并且假设您使用的是Rails 3.1+,具有批量分配安全性和白名单,这是最新的3.2.x中的默认设置)您正在将
\u属性
添加到在
attr\u accessible
中定义的属性名称的末尾,以用于接受嵌套属性的对象。在Rails 4中,大规模分配安全性正在消失,因此如果您对使用强_参数感兴趣,那么现在是研究Rails 4技术和其他新的Rails 4技术(Rails api、ActiveModel::Serializers等)的好时机,这些技术目前可以在Rails 3中使用

更新:


自从问题被更新后,我现在看到超级英雄和超级团队有关联,反之亦然。无论是超级英雄队还是超级英雄队,这种联系都是不必要的,所以我会取消它。问题中的控制器似乎仍然缺少一些代码,因为在加载创建表单时,它应该路由到“新建”操作方法,并路由到接受表单提交的“创建”操作方法,因此至少应该有两个称为“新建”和“创建”的方法。开始一个新项目并使用rails generate scaffold方法来获得初始内容可能是一个好主意,因为您已经了解了模式(通过我刚才提到的更改,可以删除超级英雄与power_团队的关联,反之亦然)。基于其他问题,我知道您对Rails并不陌生,但以基线为例总是很好的:

我尝试过这个,但我认为这与批量分配安全无关,我正在尝试更新一个单独的关系模型。我有一个模型superhero,它更新了团队和权力的嵌套关系(superhero\u team,superhero\u power),我要做的是从同一个查询中更新权力和团队(power\u team)之间的关系表。问题是superhero与(power_团队)表没有关系。我更新了答案,表示我假设您希望在power_团队模型上使用
属于:team
,尽管这很难说,因为我不知道模式是什么样子。希望能有帮助。@gary-s-weaver谢谢你的评论,我改变了周围的关系模型,我放弃了超级英雄团队和超级英雄,创建了一个超级英雄团队表,其中有3个成员,我有点让它工作了。问题是我保存了这个:(把它想象成一个表格(标题)超级英雄团队力量(第1行)[1,1,空白](第2行)[1,空白,2]。我想要的是[1,1,2].@jmorrisette没问题。请更新问题,以说明您使用表单访问的控制器中的当前代码、与问题相关的模型,以及帮助更快地解决问题的表单。听起来它好像在进行两次创建,但不确定为什么不看到它。@gary-s-weaver我修改了问题,我可以看到你所说的两次创建是什么意思,似乎是为电源创建一次,然后为团队创建一次(两次创建),我希望它只创建一次,感觉我需要一个“每个”在那里?很可能你需要使用你提到的after_save hook来设置关联。这似乎是错误的:
@power\u team=PowerTeam.new(params[:电源ID][:团队ID])
假设请求参数
power\u id
可以使用键
:power\u id
访问,并返回一个带有键的哈希值,
:team\u id
,几乎可以肯定不是这样。此外,如果没有模式或表单代码等。您正在使用,则需要进行大量假设和猜测才能确定帮助,这样可能有助于将该信息添加到您的问题中。
Hero | Power | Team
  1      1       1
  1      2       1
belongs_to :team