2011-03-06 121 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