2011-12-02 16 views
15

私は奇妙なシナリオを持っています:Pの作成者と現在のユーザーが友人になった時点ですべての投稿Pを注文したいと思います。Railsは関連モデルの属性に基づいてエントリをソートします

結果は、一番上の友人の新しい投稿の投稿と、一番下の古い友達の投稿のリストになります。すべてのユーザーは他のすべてのユーザーの友人だとみなすことができますが、各友人の作成時間はさまざまです。

投稿、ユーザー、友情モデルがあります。投稿はユーザーに属し、ユーザーには多くの友人関係があります。

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

あなたがそうのように、参加ネストされた操作を実行して、関連付けられたテーブルの上に注文することができますよう

class Post < ActiveRecord::Base 
    belongs_to :user 

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

どのようにスコープにそれを回すでしょうか? – MicFin

3

電源を入れ付きスコープにショーン・ヒルの答えSean Hillの答えは、やや修正されていて、Rails 4のfields_forとの関係を通じてhas_manyを使って結果を並べ替えることができます。

メッセージが両方のConversatiに属していればまずユーザーページの会話の一覧が必要です(一部のメッセージ属性を更新または変更する前に、会話の属性でソートされているなど)。 「タイトル」)ではなく、メッセージから、会話と会話の属性にメッセージを介して移動できます。ビューで

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

またはUser.rbモデルで:

has_many :messages, -> {joins(:conversation).order("title ASC")} 
0

これにジャスト補遺、:

@posts = Post.joins(:user => :friendships).order("friendships.friended_at") 
関連する問題