동적 속성 기반 파인더를 객체로 범위를 범할 수 있습니까?
-
19-09-2019 - |
문제
나를 신경 쓰지 마세요, 나는 내 속성 이름을 틀었습니다 :(
이것은 내가 사용한 정확한 구문을 사용하여 전적으로 가능합니다. 철자를 할 수 있어야합니다!
나는 이것을 작동시킬 수 없으며, 해결책이 있어야하는 충분한 시나리오처럼 보이지만, 유용한 Google 결과를 얻기 위해 올바른 용어로 운이 좋지 않습니다.
나는 이것을하고 싶다 :
u = User.first
u.clients.find_or_create_by_email('example@example.com')
새로운 효과와 함께 Client
함께 만들어졌습니다 user_id = u.id
.
a를 통해 멋진 다이내믹 파인더를 얻을 수 있습니까? has_many
관계? 그렇지 않다면 왜?
감사 :)
해결책 2
이것은 내가 사용한 정확한 구문을 사용하여 전적으로 가능합니다. 철자를 할 수 있어야합니다!
다른 팁
이것
u = User.first
u.clients.find_or_create_by_email('example@example.com')
Has_many 관계 설정이있는 경우 작동합니다. 그러나 클라이언트 오브젝트에 유효성 검사가 설정되어 있으면 유효성 검사 오류가 발생하지 않으며 유효성 검사에 실패하면 조용히 실패합니다.
할 때 콘솔의 출력을 확인할 수 있습니다.
u.clients.find_or_create_by_email('example@example.com') # => #<Client id: nil, email: 'example@example.com', name: nil, user_id: 1, another_attribute: nil, active: true, created_at: nil, updated_at: nil>
유효성 검사가 실패하고 클라이언트가 생성되지 않기 때문에 user_id가 설정되지만 클라이언트의 ID는 없습니다.
따라서 클라이언트 객체의 필요한 모든 속성을 전달하고 클라이언트 객체에 대한 유효성 검사가 성공적으로 전달 된 경우에만 클라이언트를 생성해야합니다.
따라서 클라이언트 모델이 이메일과는 별도로 이름에 대한 검증이 있다고 가정 해 보자.
u.clients.find_or_create_by_email_and_name('example@example.com', 'my_name') #=> #<Client id: 1, email: 'example@example.com', name: 'my_name', user_id: 1, another_attribute: nil, active: true, created_at: "2009-12-14 11:08:23", updated_at: "2009-12-14 11:08:23">
제휴하지 않습니다 StackOverflow