2011-01-20 2 views
3

카테고리 및 게시물과 같은 모델이있는 레일 3 앱이 있습니다.has_many 관계에서 가장 최근의 객체를로드하려면 어떻게해야합니까?

카테고리

has_many : 게시물

포스트

belongs_to : 카테고리 I는 반복하지 않고 옆에 나와있는 가장 최근의 게시물 카테고리의 목록을 표시 할 수 있도록하려면

각 카테고리에 대해 데이터베이스를 조회하고 카테고리 당 하나의 게시물 만 되돌립니다.

나는이 질문을 제기 할 때 같은 질문을하고 싶습니다. - SQL join: selecting the last records in a one-to-many relationship -하지만 Active Record를 사용하고 있습니다.

멍청한 짓일까요? 나는 그 (것)들을 적재하게 열망해서 종류를위한 모든 포스트를 다만 후에 당겨야 하는가? 퍼포먼스에 대해 걱정했기 때문에 이것을 연구하기 시작했습니다.

답변

3

직접 쿼리를 작성하지 않아도 가능한지 확실하지 않습니다. 이 문제는 레일이 열심히로드하는 것을 다루는 방법이 모든 조건부에 도달하거나 결과를 제한하려고 할 때 그렇게 좋지 않다는 것입니다. ,

Category.includes(:last_post).all 

을하지만, 이것에 문제가 있기 때문에이 생성하는 SQL입니다 : 그럼 당신은 사용할 수 있습니다 일반적으로 포함

class Category < ActiveRecord::Base 
    has_one :last_post, :class_name => "Post", :foreign_key => "category_id", :order => "created_at desc" 
end 

: 당신은 거의 다른 연결을 만들어 당신이 원하는 일을 포함 할 수 있습니다 category.last_post를 호출 할 때 마지막 게시물 만 반환하더라도 범주에서 모든 게시물을 선택합니다. 그러면 다음과 유사한 SQL이 생성됩니다.

SELECT `categories`.* FROM `categories` 
SELECT `posts`.* FROM `posts` WHERE (`posts`.category_id IN (1,2)) ORDER BY created_at desc 
+0

답변 주셔서 감사합니다. 귀하의 의견으로는, 이런 종류의 쿼리를 작성하는 것이 낫습니다. – someoneinomaha

관련 문제