Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails——使用hasMany=>;保存和更新连接表中的属性;通过_Ruby On Rails - Fatal编程技术网

Ruby on rails RubyonRails——使用hasMany=>;保存和更新连接表中的属性;通过

Ruby on rails RubyonRails——使用hasMany=>;保存和更新连接表中的属性;通过,ruby-on-rails,Ruby On Rails,为了简化,我有3个表: 人 拥有很多:能力,通过=>:stats 才能 有很多人,通过=>:stats 统计数据 属于:人 属于:能力 统计有一个额外的属性叫做“评级” 我想做的是制作一个编辑人员表单,它总是列出数据库中当前的所有能力,并让我为每个能力分配一个等级 就我个人而言,我不知道该怎么做。在创建一个新用户时,我成功地使其工作,如下所示: (来自人力资源总监) def新建 @character=character.new @能力=能力 @能力。每个人都有能力| @person.stats.

为了简化,我有3个表:

拥有很多:能力,通过=>:stats

才能

有很多人,通过=>:stats

统计数据

属于:人

属于:能力

统计有一个额外的属性叫做“评级”

我想做的是制作一个编辑人员表单,它总是列出数据库中当前的所有能力,并让我为每个能力分配一个等级

就我个人而言,我不知道该怎么做。在创建一个新用户时,我成功地使其工作,如下所示:

(来自人力资源总监)

def新建
@character=character.new
@能力=能力
@能力。每个人都有能力|
@person.stats.build(:ability\u id=>ability.id)
结束
结束
从人民的角度来看:
@ability.id,:index=>nil%>
零%>
这成功地为我提供了一个技能列表,旁边有评级框,如果我正在使用新用户,可以保存这些技能

问题是,如果我加载编辑表单(使用相同的表单部分),它不会返回评分,如果我保存,即使评分完全相同,它也会在统计表中创建重复条目,而不是更新它

我意识到我是一个糟糕的程序员,我可能做得不对,但我如何让编辑表单回忆分配给该用户的每个功能的当前评级,其次,如果个人和能力的组合已经存在,我如何让它更新评级而不是复制评级?

Railscasts剧集,并展示如何在一种形式中编辑多个模型。此处显示的示例与您尝试执行的操作类似,因此可能会对您有所帮助(与Ascicast上的相同插曲:,)。

Railscasts插曲,并演示如何以一种形式编辑多个模型。这里显示的示例看起来与您正在尝试的类似,所以它可能会帮助您解决问题(与ascicasts上的相同集:,)。

不应该这样吗

Character
has_many :stats
has_many :abilities, through => :stats

Ability
has_many :stats
has_many :characters, through => :stats

Stat
belongs_to :character
belongs_to :ability
?

还有,是人还是人物?你对两者都有不同的说法。(我将在我的回答中加入性格)

我认为你已经犯了“我将尝试对我的模式进行简化,以试图说明一个问题,但相反,我会把事情弄得更复杂,把问题搞得一团糟,这样就没有意义”的错误。无论如何,我可以看到一些问题:

1) 第一件事是你要在一个角色被创造出来的时候就把所有可能的能力都添加到这个角色中。这是愚蠢的-他们应该在开始时默认没有任何能力,然后你为他们的能力创建连接表记录(统计数据)(通过勾选表单中的复选框)

2) 像这样操作连接记录的一种简单方法是利用has\u many:abilities宏提供的“ability\u ids=”方法-在api中称为“collection\u ids=”

换句话说,如果你说

@character.ability_id=[1,12,30]

然后,这将使该角色和能力1、12和30之间建立连接,并删除该角色和不在上述列表中的能力之间的任何其他连接。结合以[]结尾的表单字段名将其值放入数组的事实,您可以执行以下操作:

#controller
def new
 @character = Character.new
 @abilities = Ability.all
end

#form
<% @abilities.each do |ability| %>
  <div class="field">
    <%= t.label @ability.name %>
    <%= check_box_tag "character[ability_ids][]" %>
  </div>
<% end %>

#subsequent controller (create action)
@character = Character.new(params[:character]) #totally standard code
#控制器
def新
@character=character.new
@能力=能力
结束
#形式
#后续控制器(创建操作)
@character=character.new(参数[:character])#完全标准代码
注意这里根本没有提到统计数据。我们指定角色和能力之间的关联,并让rails处理连接。

不应该这样吗

Character
has_many :stats
has_many :abilities, through => :stats

Ability
has_many :stats
has_many :characters, through => :stats

Stat
belongs_to :character
belongs_to :ability
?

还有,是人还是人物?你对两者都有不同的说法。(我将在我的回答中加入性格)

我认为你已经犯了“我将尝试对我的模式进行简化,以试图说明一个问题,但相反,我会把事情弄得更复杂,把问题搞得一团糟,这样就没有意义”的错误。无论如何,我可以看到一些问题:

1) 第一件事是你要在一个角色被创造出来的时候就把所有可能的能力都添加到这个角色中。这是愚蠢的-他们应该在开始时默认没有任何能力,然后你为他们的能力创建连接表记录(统计数据)(通过勾选表单中的复选框)

2) 像这样操作连接记录的一种简单方法是利用has\u many:abilities宏提供的“ability\u ids=”方法-在api中称为“collection\u ids=”

换句话说,如果你说

@character.ability_id=[1,12,30]

然后,这将使该角色和能力1、12和30之间建立连接,并删除该角色和不在上述列表中的能力之间的任何其他连接。结合以[]结尾的表单字段名将其值放入数组的事实,您可以执行以下操作:

#controller
def new
 @character = Character.new
 @abilities = Ability.all
end

#form
<% @abilities.each do |ability| %>
  <div class="field">
    <%= t.label @ability.name %>
    <%= check_box_tag "character[ability_ids][]" %>
  </div>
<% end %>

#subsequent controller (create action)
@character = Character.new(params[:character]) #totally standard code
#控制器
def新
@character=character.new
@能力=能力
结束
#形式
#后续控制器(创建操作)
@character=character.new(参数[:character])#完全标准代码
注意这里根本没有提到统计数据。我们指定角色和能力之间的关联,并让rails处理连接