我一直在试图更新现有的多对多记录。
项目模型:
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!
答案 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。希望它有所帮助!