2011-12-02 2 views
15

이상한 시나리오가 있습니다. P의 작성자와 현재 사용자가 친구가 된 시점까지 모든 게시물 P를 주문하고 싶습니다.레일스 관련 모델의 속성을 기반으로 항목 정렬

결과는 가장 최근 친구의 소식이있는 소식 목록과 맨 아래에있는 더 오래된 친구의 소식 목록이됩니다. 우리는 모든 사용자가 다른 모든 사용자의 친구라고 추측 할 수 있지만, 각 우정에는 다양한 생성 시간이 있습니다.

본인에게는 게시, 사용자 및 친교 모델이 있습니다. 게시물은 사용자에게 속하고 사용자는 많은 우정을가집니다.

class User < ActiveRecord::Base 
    has_many :friendships 
    has_many :friends, :through => :friendships 
    has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id" 
    has_many :inverse_friends, :through => :inverse_friendships, :source => :user 
end 

class Friendship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, :class_name => "User" 
end 

class Post < ActiveRecord::Base 
    belongs_to :user 
end 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 감사!

답변

26

당신은 중첩을 수행하여 관련 테이블에 주문할 수 있습니다 그래서 같은 조인

@posts = Post.joins(:user => :friendships).order("friendships.friended_at") 
+2

이 어떻게 범위로 그를 설정합니다 :

<% fields_for :messages, @user.messages.joins(:conversation).order("title ASC") do %> 

또는 User.rb 모델

? – MicFin

3

전원을 켜고 숀 힐의 답변을과 범위에이에

class Post < ActiveRecord::Base 
    belongs_to :user 

    scope :ordered, -> { 
    joins(:user => :friendships).order("friendships.friended_at") 
    } 
end 
0

그냥 부록으로 감사합니다. Sean Hill의 대답은 약간 수정되었지만, 레일스 4에서 fields_for와의 관계를 통해 has_many를 사용하여 결과를 정렬 할 수 있습니다.

그래서 메시지가 모두 Conversati 먼저 사용자 페이지에서 일부 메시지 속성을 업데이트하거나 수정하기 전에 대화 목록 (예 : 대화 상자의 속성)별로 대화 목록을 원합니다. "title")이 아니라 메시지에서 대화 및 대화 특성에 메시지를 통해 이동할 수 있습니다. 뷰에서

:

has_many :messages, -> {joins(:conversation).order("title ASC")} 
관련 문제