2011-12-02 17 views
15

Tengo un extraño escenario: me gustaría ordenar todas las publicaciones P para el momento en que el creador de P y el usuario actual se hicieron amigos.Rails ordenar entradas basadas en los atributos del modelo relacionado

El resultado sería una lista de publicaciones con publicaciones de amigos más nuevos en la parte superior y publicaciones de amigos más antiguos en la parte inferior. Podemos suponer que todos los usuarios son amigos de todos los demás usuarios, pero cada amistad tiene diferentes tiempos de creación.

Tengo modelos de publicaciones, usuarios y amistad. Las publicaciones pertenecen a los usuarios y los usuarios tienen muchas amistades.

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 

¿Cuál es la mejor manera de hacerlo? ¡Gracias!

Respuesta

26

Usted puede ordenar en la tabla asociada al hacer un anidado, así: respuesta

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

¿Cómo te convertir eso en un ámbito? – MicFin

3

Encienda Sean de Hill en un ámbito con:

class Post < ActiveRecord::Base 
    belongs_to :user 

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

Sólo una adición a esto, como gracias, la respuesta de Sean Hill también funciona, ligeramente modificada, para ordenar los resultados usando has_many a través de las relaciones con fields_for en Rails 4.

Así que si los mensajes pertenecen a ambos Conversati ons y Usuarios y primero desea una lista de Conversaciones en la página Usuario, tal vez antes de actualizar o modificar algún atributo de mensaje, pero ordenada por un atributo en Conversaciones (p. "título"), no mensajes, puede ir del usuario a través de mensajes a las conversaciones y atributos de conversación.

En la vista:

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

o en el modelo User.rb:

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