2012-01-03 5 views
0

레일 3.1.3과 루비 1.9.2를 사용하고 있으며 데이터베이스에 시드 데이터를 생성 할 때 버그가있는 것 같습니다. 간단한 와인 수집 앱을 만들고 있는데, 단지 두 개의 간단한 인스턴스 (name이 "빨간색"또는 "흰색"인)가있는 Grape 클래스가 있습니다. 나는 belongs_toGrape 클래스 인 Varietal 클래스를 가지고 있으며 간단한 name 필드 만 가지고 있습니다. 나는 데이터베이스의 데이터에 모습을 갈 때 , 이상하게ID 대신 Rails 3.1에서 객체를 사용하여 호출하기

# create some reds 
r = Grape.find_or_create_by_name('Red') 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r) 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r) 
Varietal.find_or_create_by_name_and_grape_id('Malbec', r) 

# create some whites 
w = Grape.find_or_create_by_name('White') 
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w) 
Varietal.find_or_create_by_name_and_grape_id('Riesling', w) 
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w) 

Varietals의 모든는과 관련된 : 나는 어떤 씨앗 데이터를 생성하기 위해 갈 때

, 나는 다음과 같은 코드를 사용 "빨간색"Grape. 레일즈 콘솔을 사용하여, id 필드를 인스턴스 Grape 인스턴스가 아닌 인스턴스로 전달하면 올바른 동작을 얻는다는 것을 알았습니다.

내가 누락 된 항목이 있습니까? Rails에서 원시 ID 대신 항상 ActiveRecord 객체를 전달할 수 있다고 생각하여 id 필드 값을 자동으로 조회했습니다.

+0

동적 검색기 by_grape_id를 명시 적으로 사용하면 ID를 전달할 것으로 예상됩니다. – Johny

+0

그게 사실이라면, 왜 흰 포도 인스턴스와 find_by_grape_id 잘 작동합니까? 또한 find_or_create에 대해 실행 된 SQL이 먼저 흰색 포도씨 ID의 올바른 SELECT를 수행하지만 Varietal을 만들려면 INSERT에 잘못된 ID가 있음을 확인했습니다. 아직도 저에게 버그처럼 보입니다. –

답변

0

ID 대신 객체를 전달할 수 있지만 라우팅 및 연결에 더 많은 경향이 있습니다.

당신은 및 을 grape_id 이름으로 찾기를 요구하지만, 이름과 문제가 자리하고있는 곳입니다 포도 예를에 전달된다.

ID를 파인더에 명시한 경우 ID를 전달해야합니다.

0

rwGrape 개체를 반환해야합니다. 맞습니까? 그렇다면이 id 요소에 액세스 할 수 없습니까?

# save grape stuff by entering the ID instead of the object 
# create some reds 
r = Grape.find_or_create_by_name('Red') 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r.id) 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r.id) 
Varietal.find_or_create_by_name_and_grape_id('Malbec', r.id) 

# create some whites 
w = Grape.find_or_create_by_name('White') 
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w.id) 
Varietal.find_or_create_by_name_and_grape_id('Riesling', w.id) 
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w.id) 

이것은 선택한 포도의 ID를 전달하며 사용중인 동적 찾기와 일치합니다.

관련 문제