2011-03-06 2 views
0

기존 레코드를 여러 레코드로 업데이트하려고 시도하고 있습니다.많은 레코드를 많은 레코드로 업데이트하는 레일

프로젝트 모델 :

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

프로그래머 모델 :

class Programmer < ActiveRecord::Base 
    has_many :projects 
    has_many :assignments, :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 
:

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

그래서 지금처럼 연결된 데이터가

볼 수 있듯이 마이크의 첫 번째 연관성을 "homework1"으로 업데이트하려고합니다. 모든 숙제는 이미 과제 테이블에 있으므로 "homework1"을 찾아 마이크에 지정하십시오. 불행히도, 세 번째 줄을 입력 할 때 오류는 없지만 업데이트하지는 않습니다. 메모리에 p.assignments == homework1이지만 DB에서는 여전히 동일합니다 (p.save 이후에도). 프로젝트의 조인 테이블은 전혀 변경되지 않습니다.

mysql의 로그는 제 3 행을 입력 할 때마다 생성되는이 명령을 보여줍니다.

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

0

당신은 기본적으로 중첩 된 개체 양식에 대한 지식을 향상시킬 수 있습니다 라이언 베이츠가 쓴이 좋은 기사를 확인할 수 있습니다. 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

+0

프로젝트 모델 내부에 "accepts_nested_attributes_for : assignments"를 설정 했습니까? 나는 아마도 당신이 코드에서 누락 된 부분 일 것이라고 생각합니다. – RubyFanatic

+0

안녕하세요 @RubyFanatic 링크가 끊어졌습니다. 업데이트하십시오. – nifCody

관련 문제