2011-12-02 34 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")} 
相关问题