我有一个奇怪的场景:我想在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
最好的方法是什么?谢谢!
答案 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")}