Rails更新多对多记录

时间:2011-03-06 23:21:56

标签: ruby-on-rails many-to-many save

我一直在试图更新现有的多对多记录。

项目模型:

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

所以你可以看到,我正在尝试更新迈克的第一个hw与“ homework1 ”的联系。所有的家庭作业都已经在作业表中,所以它只是找到“ homework1 ”并将其分配给迈克。不幸的是,当我键入第三行时没有错误,但它没有更新它。在内存中,p.assignments == homework1,但在DB中它仍然是相同的(即使在p.save之后)。项目的连接表根本没有改变。

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

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

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

更新

所以我发现我可以直接引用连接表来编辑链接。有点像:

proj = p.projects.first

proj.assignment_id = 12
proj.save!

2 个答案:

答案 0 :(得分:0)

如果您只想引用该对象,则需要编辑迁移脚本(db / migrate)。一个例子:

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

答案 1 :(得分:0)

你可以查看Ryan Bates写的这篇好文章,基本上可以提高你对嵌套对象形式的了解。 http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes。希望它有所帮助!