Rails基于相关模型的属性对条目进行排序

时间:2011-12-02 03:15:10

标签: ruby-on-rails-3

我有一个奇怪的场景:我想在P的创建者和当前用户成为朋友之前订购所有帖子P.

结果将是一个帖子列表,其中有较新朋友的帖子在帖子的顶部和较老朋友的帖子。我们可以假设所有用户都是所有其他用户的朋友,但每个友谊都有不同的创建时间。

我有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

最好的方法是什么?谢谢!

3 个答案:

答案 0 :(得分:30)

您可以通过嵌套连接在关联表上进行排序,如下所示:

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

答案 1 :(得分:3)

将Sean Hill的答案转变为范围:

class Post < ActiveRecord::Base
  belongs_to :user

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

答案 2 :(得分:0)

作为对此的补充,谢谢你,Sean Hill的回答也有效,稍加修改,使用has_many通过与Rails 4中的fields_for的关系对结果进行排序。

因此,如果消息属于对话和用户,并且您首先需要在用户页面上的对话列表 - 可能在更新或修改某些消息属性之前 - 但是在对话上按属性排序(例如&#34;标题&#34; ),而不是消息,您可以从用户通过消息转到对话和对话属性。

在视图中:

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

或在User.rb模型中:

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