2010-11-16 21 views
1

为了简化问题,我有3个表:Ruby on Rails的 - 保存和与连接表更新的属性有很多=>通过

的has_many:能力,通过=>:统计

能力

的has_many:人,通过=>:统计

统计

belongs_to的:人

belongs_to的:能力

统计有一个名为 '评级' 的额外属性。

我希望做的是进行编辑的人形式总是列出当前数据库中的所有的能力,让我指定每一个等级。

对于我的生活,我无法弄清楚如何做到这一点。我设法得到它像这样的东西创建一个新用户时工作:

(从人民控制器)

def new 
@character = Character.new 
    @abilities = Ability.all 
    @abilities.each do |ability| 
     @person.stats.build(:ability_id => ability.id) 
    end 
end 

From the people form: 

<% for @ability in @abilities do %> 
    <%= fields_for "person[stats_attributes]" do |t| %> 
<div class="field"> 
    <%= t.label @ability.name %> 
    <%= t.hidden_field :ability_id, :value => @ability.id, :index => nil %> 
    <%= t.text_field :rating, :index => nil %> 
    </div> 
    <% end %> 
    <% end %> 

这成功地让我的能力与评级箱旁边有一个列表,让我保存他们,如果我正在创建一个新用户。

问题是,如果我然后加载编辑表单(使用相同的表单部分),它不会带回评级,如果我保存,即使具有完全相同的评级,它会创建重复条目统计信息表,而不是更新它。

我知道我是一个可怕的程序员,我可能这样做了错误的方式,但我如何才能编辑表单召回分配给每个能力,该用户的额定电流,其次我怎么如果人和能力的组合已经存在,它会更新评分而不是重复评分?

回答

0

Railscasts情节196197展示如何在一个表格编辑多个模型。有实例显示类似于你要做到这一点,可以帮助你什么(同集上ascicasts:196197)。

1

难道不该

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)首先,您要在创建角色后立即为角色添加所有可能的功能。这很愚蠢 - 他们应该从默认开始没有能力,然后创建连接表记录(统计信息),以便他们做的拥有(通过勾选表单中的复选框)。在API http://railsbrain.com/api/rails-2.3.2/doc/index.html?a=M001885&name=has_many

在其他被称为“collection_ids =” - 能力宏为您提供:

2)一个简单的方法来操纵加入的记录,像这样是利用了“ability_ids =”方法的的has_many也就是说,如果你说

@ character.ability_ids = [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 

请注意,有没有提到的统计资料,在这里所有。我们在角色和能力之间指定我们想要的关联,并让rails处理连接。

相关问题