2012-04-20 2 views
1

레일 3 응용 프로그램에서 부모 연결의 열이 특정 문자열 인 레코드를 찾으려고합니다. 예 : 카테고리 이름 = "my_category"인 게시물.Rails 3에서 belongs_to 연관의 열을 쿼리하는 가장 효율적인 방법은 무엇입니까?

class Post 
    belongs_to Category 
end 

class Category 
    has_many Posts 
end 

카테고리는 이름 열을 포함하며 검색을 실행할 수있는 유일한 데이터입니다. 따라서 category_id에 직접 필터링 할 수는 없습니다.

이 작업을 수행하는 가장 효율적인 레일스 방식은 무엇입니까? 나는 그들이 일해야하는 것처럼 보이는 몇 가지 옵션을 시도했지만,하지 않았다!.

Post.joins(:category).where('category.name'=>'my_category') 
Post.joins(:category).where(:category=>{:name=>'my_category'}) 
Post.includes(:category).where('category.name'=>'my_category') 
Post.includes(:categories).where('category.name'=>'my_category') 
Post.includes(:category).where(:category=>{:name=>'my_category'}) 

좀 레일 마법을 내려다 해요 만약 내가 두 줄

category=Category.where(:name=>"my_category") 
Post.where(:category_id=>category) 

에서이 작업을 수행하는 방법을 볼 수 있지만 내가 궁금해? 그것이 멍청한 질문이라면 미안해, 나는 아직도 배우고있어!

답변

2
Post.joins(:category).where(:categories => { :name => "my_category" }) 

여기서 :categories은 WHERE 부분에 복수형입니다.

+0

감사합니다 @ blackbird07! 정확히 내가 찾고 있던 것, 단일 데이터베이스 호출. 나는 너무 가까웠다. 단지 범주를 복수화해야했다. 이러한 복잡한 활성 레코드 쿼리는 항상 나를 혼란스럽게합니다. 나는 항상 올바른 구문을 얻었는지 여부와 그 실패, 시행 착오와 같은 기분이 든다. 나에게 도움이 될만한 유용한 참고 사항이 있습니까? 다시 한번 감사합니다! –

+0

그래, 통증도 느낀다. 나는 레일 가이드 http://guides.rubyonrails.org/active_record_querying.html과 http://guides.rubyonrails.org/association_basics.html과 API 문서 http : //api.rubyonrails를 항상 보게됩니다. org/classes/ActiveRecord/Base.html. 후자에서 "조인"을 검색하면 예제를 찾을 수 있습니다 : 학교 및 학교 : – emrass

+0

그리고 나는 너무 배웠습니다!감사합니다 blackbird07 – Edward

1

has_many 관계가 제공하는 방법을 사용하십시오. 코멘트

에 따라
Category.where(:name => "my_category").posts 

잘못 원래

는 포스트 모델에 category_id 열이 제공

Category.find_by_name("my_category").posts 

또는

Category.where(:name => "my_category").first.posts 

가 수정되었습니다.

+0

'Category.where'가 단일 항목이 아니라 항목 배열을 반환하기 때문에 이것은 작동하지 않습니다. – emrass

+0

업데이트 해 주셔서 감사합니다. 이것은 여전히 ​​2 SELECT 문을 가져올 것입니다. 하나는 범주 용이고 두 번째는 게시물 용입니다. – emrass

+0

감사합니다. 존! 정말로 좋은 대답. 나는 코드를 정리할 새로운 것을 배웠다. 최소한의 데이터베이스 상호 작용 때문에 블랙 버드에 대한 답을했습니다. 하지만 도와 줘서 고마워! –

1

@ blackbird07 님의 @John Beynon 님의 답변에 대한 코멘트가 맞습니다.

당신은

Category.find_by_name("my_category").posts 

find_by 도우미

배열보다는 하나의 개체를 반환하려고한다.

+0

이것은 1 대신에 2 개의 선택 진술이 될 것입니다. 하나는 범주에 대한 것이고 하나는 – emrass

+0

@edward에 대한 게시물입니다. 감사합니다. 나는 새로운 것을 배웠습니다. 저는 단일 데이터베이스 호출에 대한 블랙 버드 (blackbird)에 대한 해답을 수여했습니다. 그러나 도움을 주셔서 감사합니다. –

관련 문제