2012-01-23 3 views
0

나는 이상한 문제가 있습니다.레일 3- find_by 작동하지 않습니다

두 모델 사이에 관계가 많은 사용자와 역할이 있습니다. 사용자의 역할 모음에서 이름이 'Administrator'인 역할을 필터링하려고합니다.

모델에서

이 코드 화면

puts self.roles.to_s 

인쇄 : [역할 ID : 1, 이름 : "관리자", created_at "2012-01-22 21시 55분 45초", updated_at : "2012-01-22 21시 55분 45초"]

그러나

puts self.roles.find_by_name('Administrator').to_s 

아무것도 인쇄되지 않습니다이 코드. 그리고이 하나 :

puts self.roles.find_by_name('Administrator').nil? 

인쇄 사실!

왜 내 find_by_name 메서드가 작동하지 않습니까? 콘솔에서 tryied하고 잘 작동합니다.

내 코드는 다음과 같습니다 :

puts self.roles.to_s 
puts self.roles.find_by_name('Administrator').to_s 
puts self.roles.find_by_name('Administrator').nil? 

을 그리고 출력은 다음과 같다 : 내가 잘못

[Role id: 1, name: "Administrator", created_at: "2012-01-22 21:55:45", updated_at: "2012-01-22 21:55:45"] 
<none> 
true 

을 뭐하는 거지? 그것은 바보 같은 것이어야합니다. 이 코드는 유효성 검사 메서드에 있으므로 사용자가 저장되기 전에 실행됩니다.

+1

두 테이블 모두에 이름 열이 있습니까? – jstim

+0

'find_by_name'을 호출 할 때 데이터베이스에서 새로운 역할이 있습니까? –

+0

모두 질문에 대답 – Tony

답변

3

모델을 저장하기 전에 확인 에서이 작업을 수행한다고 언급 했음. 이것이 실패하는 이유입니다. User은 아직 저장되지 않았으므로 데이터베이스에 id이 없으므로 연결을 검색 할 수있는 방법이 없습니다.

첫 번째 줄이 작동하는 이유는 (self.roles.to_s) Rails는 사용자에게 추가하는 모든 역할을 기억하지만 사용자를 저장할 때까지 데이터베이스에 저장하지 않기 때문입니다. 당신이 사용자를 저장하면, 두 번째/세 번째 줄은 잘 작동합니다 :

user = User.new 
user.roles << Role.first 
user.roles 
# => [#<Role id: 1, name: "Administrator" ...>] 
user.roles.find_by_name("Administrator") 
# => nil 
user.save # This inserts both the new user AND the associations 
user.roles.find_by_name("Administrator") 
# => #<Role id: 1, name: "Administrator" ...> 

을 당신이 당신의 검증에서이 작업을해야하는 경우, 대신 roles 배열 검색 Enumerable에서의 find 방법을 사용하여보십시오 수 있습니다

user = User.new 
user.roles << Role.first 
user.roles 
# => [#<Role id: 1, name: "Administrator" ...>] 
user.roles.find { |role| role.name == "Administrator" } 
# => #<Role id: 1, name: "Administrator" ...> 
user.roles.find { |role| role.name == "Foo" } 
# => nil 
+0

감사합니다. 딜란. – Tony

관련 문제