2011-03-06 89 views
0

我试图更新现有的多对多记录时遇到困难。更新多对多记录的Rails

项目模型:

class Project < ActiveRecord::Base 
    belongs_to :assignment 
    belongs_to :programmer 
end 

编程模型:

class Programmer < ActiveRecord::Base 
    has_many :projects 
    has_many :assignments, :through => :projects 
end 

分配模式:

class Assignment < ActiveRecord::Base 
    has_many :projects 
    has_many :programmers, :through => :projects 
end 

,所以我联系了起来,像这样的数据:

p = Programmer.create(:name => "Mike") 

p.assignments.create(:name => "homework4") 

p.assignments[0] = Assignment.find_or_create_by_name("homework1") 

p.save 

因此,您可以看到,我正在尝试将Mike的第一个hw的关联更新为“homework1”。所有的家庭作业已经在作业表中,所以它只需找到“作业1”并将其分配给麦克风。不幸的是,当我输入第三行时,没有错误,但它不会更新它。在内存中,p.assignments == homework1,但在数据库中它仍然是相同的(即使在p.save之后)。项目的连接表完全没有改变。

mysql的日志显示每当我进入第三行时生成此命令。

SELECT "assignments".* FROM "assignments" WHERE "assignments"."name" = 'homework1' LIMIT 1 

有没有更新任何地方....我做错了什么?

UPDATE

所以我发现我可能只是引用连接表,直接编辑链接。沿着线的东西:

proj = p.projects.first 

proj.assignment_id = 12 
proj.save! 

回答

0

如果你只是想对对象的引用,那么你需要编辑您的迁移脚本(DB /迁移)。举个例子:

def self.up 
    create_table :configurations do |t| 
    t.string :name 
    t.references :project # This store just the id of the object. 
    t.timestamps 
    end 
end 

不要忘记键入:

rake db:migrate 
+0

令人惊讶的是,你不需要t.references来找到父母或孩子。我上面的设置允许我找到任何与程序员和与任务相关的程序员关联的任务。 – Mason 2011-03-06 23:52:43

0

您可以检查出由Ryan贝茨写这篇好文章,基本上可以改善你的嵌套对象形式的知识。 http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes。希望能帮助到你!

+0

嗯我只是试过这个和控制台似乎不知道什么:“p.assignments_attributes = [{:id => 10,:name =>”assignment1“}]”是。错误是:未定义的方法'assignments_attributes =' – Mason 2011-03-06 23:49:47

+0

您是否在项目模型中设置了“accep_nested_attributes_for:assignments”?我认为这可能是代码中缺失的部分,以便获得上面要做的工作。 – RubyFanatic 2011-03-07 00:05:35

+0

嗨@RubyFanatic链接已损坏。请更新它 – nifCody 2016-10-26 04:19:26