2013-05-10 2 views
1
class User 
    has_many :posts do 
     def latest(report_date) 
     order(:report_date).where('report_date <= ?', report_date).limit(1) 
     end 
    end 
end 

class Post 
    belongs_to :user 
end 

각 사용자의 마지막 게시물이있는 사용자 레코드를 검색하고 싶습니다.범위를 정의하여 has_many 연관의 레코드 하나를 얻는 방법은 무엇입니까?

나는이 작업을 수행 할 수 있습니다 :이 쓸 수있는 더 좋은 방법이

users = User.all.map{|user| user.posts.latest(7.weeks.ago).first}.compact 

있습니까? 예 :

users = User.posts.latest(7.weeks.ago).all 

(해당하는 경우)?

답변

1

이와 비슷한 것을 추가하는 경향이 있습니다. 그것은 당신의 경우에 효과가 있습니까? 당신이 목록 쿼리에 '를 포함'할 수 있기 때문에 그것은 당신이 컨트롤러에서 이런 일을 할 것, 실제로

class User < ActiveRecord::Base 
    has_many :posts 
    has_one :latest_post, :class_name => 'Post', :order => 'report_date desc' 

    ... 

end 

... 좋은 데요 :보기에, 다음

@users = User.include(:latest_post) 

을 그리고 어디를 사용자를 렌더링하면 user.lastest_post를 참조하면 열심히로드됩니다.

예를 들어 -이 index.html.haml에 있다면

= render @users 

당신은 불행하게도 _user.html.haml

= user.name 
= user.latest_post.report_date 
+0

에서 latest_post의 has_one 관계가 액티브 작동하지 않습니다에 액세스 할 수 있습니다 . User.latest_post.all 번호 'latest_post'정의되지 않은 방법으로 오류 <클래스 : 0x2e231dff> 내가 User.all.map을 {수행해야 | X | x.latest_post} 하지만 그렇게되면 연결이 끊어지고 열심히로드되는 것을 방지 할 수 있습니다. 예 : User.active_user.includes (: 추종자) .latest_post.all <- 이 작동하지 않습니다. – user2371769

+0

예제 컨트롤러와 뷰 코드를 포함하도록 답변을 업데이트했습니다. – Swards

+0

당신의 솔루션은 훌륭하게 작동했습니다. 하나 더 범위를 추가해야했습니다. – user2371769