2013-10-13 4 views
0

은의 나는 두 가지 모델이 있다고 가정하자 : ParentChild찾기 객체 예를 들어

parent.rb

has_many :children 

child.rb을

belongs_to :parent 

나는 모든 부모를 찾고 싶습니다 parent.children.last.gender == "boy" 또는 parent.volunteer == "yes"

미리 감사드립니다.

답변

0

"마지막 아이는 아이"인가 "아이가 아이인가"해야합니까? 마지막 자식에 대한

Parent.includes(:child).where("children.gender = 'boy' or parents.volunteer = 'yes'") 

가 소년 : 이것은 후자의 작동 여기 당신이, 당신은 아마 작업을 진행이나 레일 구문을 사용하여 비슷한 만들 find_by_sql를 사용할 수있는 SQL의 필요에 해당하는이 또는 Arel.

select p.* from parents p inner join 
(select parent_id, gender from children where id in (select max(id) from children group by parent_id)) c 
on c.parent_id = p.id where p.volunteer = 'Yes' OR c.gender = 'Boy'; 

이 쿼리를 실행 꽤 비싼 수 있습니다 데이터베이스의 크기에 따라 다른 해결책은 부모 레코드에 마지막 아이의 성별을 저장할 수 있으며, 업데이트 할 수있는 것이이 다른라면 새로운 아이가 추가 될 때마다 현재 부모가 가지고있는 성별.

+0

불행히도, "마지막 아이는 소년"이 필요합니다. 그래서 나는 이것을하는 방법을 결정하는 그러한 투쟁을하고있다. – David

+0

아무런 문제가 없지만 여전히 더 추한 쿼리 일뿐입니다. – iouri

+0

그 더러운 쿼리는 무엇일까요? – David