2011-12-02 33 views
15

我有一個奇怪的場景:我想在P創建者和當前用戶成爲朋友的時候訂購所有帖子P.Rails根據相關模型的屬性對條目進行排序

結果將是一個帖子列表,其中包含較新朋友的帖子在頂部和較老朋友帖子的底部。我們可以假設所有用戶都是其他用戶的朋友,但每個友誼都有不同的創建時間。

我有Post,User和Friendship模型。帖子屬於用戶,用戶有很多友誼。

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

你將如何把它轉換成一個範圍? – MicFin

3

打開肖恩·希爾的回答與一個範圍:

class Post < ActiveRecord::Base 
    belongs_to :user 

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

只是一個附錄於此,如謝謝你,肖恩希爾的答案也可以,稍作修改,通過與rails_for Rails 4中的關係使用has_many對結果進行排序。

因此,如果Messages屬於兩個Conversati你可能首先需要用戶頁面上的對話列表(可能在更新或修改某些消息屬性之前),但是按對話屬性(例如,對話)進行排序。 「標題」),而不是消息,您可以從用戶通過消息到對話和對話屬性。

在視圖:

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

或User.rb模式:

has_many :messages, -> {joins(:conversation).order("title ASC")} 
相關問題