sql - relacionadas - relacion muchos a muchos laravel
Ordene por cuenta en has_many: a través de (3)
Uso Rails 4. Tengo una aplicación donde tengo una relación de muchos a muchos:
class User < ActiveRecord::Base
has_many :relationshipfollows, :foreign_key => "follower_id",
:dependent => :destroy
has_many :following, :through => :relationshipfollows, :source => :followed
end
class Project < ActiveRecord::Base
has_many :relationshipfollows, :foreign_key => "followed_id",
:dependent => :destroy
has_many :followers, :through => :relationshipfollows, :source => :follower
end
class Relationshipfollow < ActiveRecord::Base
belongs_to :follower, :class_name => "User"
belongs_to :followed, :class_name => "Project"
end
Sigo este tutorial: http://ruby.railstutorial.org/chapters/following-users?version=3.0#top
Pero ahora me gustaría enumerar todos los proyectos ordenados por el número de seguidores. Me gusta esto :
1. project1 | 99 followers
2. project2 | 16 followers
3. project3 | 2 followers
...
Soy nuevo en los rieles y creo que sigo cometiendo un error porque pruebo muchos ejemplos como este: Rails 3 Order By Count on has_many: through o has_many, a través de: recuento de relaciones
Intento este método: Project.joins(:relationshipfollows).group("relationshipfollows.project_id").order("count(relationshipfollows.project_id) desc")
Pero tengo este error: SQLite3::SQLException: no such column: relationshipfollows.project_id: SELECT "projects".* FROM "projects" INNER JOIN "relationshipfollows" ON "relationshipfollows"."followed_id" = "projects"."id" GROUP BY relationshipfollows.project_id ORDER BY count(relationshipfollows.project_id) desc
Y pruebo con otro método:
Project.joins(:relationshipfollow).select(''following.*, COUNT(followers.id) AS user_count'').group(''project_id'').order(''COUNT(followers.id) DESC'')
Pero tengo este error: la Association named ''relationshipfollow'' was not found on Project; perhaps you misspelled it?
Association named ''relationshipfollow'' was not found on Project; perhaps you misspelled it?
¿Podría alguien ayudarme a encontrar la dirección correcta para que todo funcione?
Cordialmente
Edición: creo que el problema es de aquí. Cuando intento esto:
Relationshipfollow.select(:followed_id, "COUNT(follower_id) AS total").group(:followed_id).order("total DESC")
él me devuelve esto:
=> # ActiveRecord :: Relación [# Relationshipfollow id: nil, followed_id: 2, # Relationshipfollow id: nil, followed_id: 1, # Relationshipfollow id: nil, followed_id: 3]
Todos los proyectos están ordenados por el número de seguidores y todos los follow_id (proyectos) están en orden en relación con mi prueba. Pero cuando me uno a esto en mi proyecto modelo así:
Project.joins(:relationshipfollows).select(:followed_id, "COUNT(follower_id) AS total").group(:followed_id).order("total DESC")
él me devuelve una lista de proyectos pero con project_id NULL:
=> #ActiveRecord::Relation [# Project id: nil, # Project id: nil, # Project id: nil]
Esto es lo que haría:
#app/models/project.rb
Class Project < ActiveRecord::Base
has_many :relationshipfollows, :foreign_key => "follower_id", :dependent => :destroy
has_many :followers, :through => :relationshipfollows, :source => :follower
scope :sort_by_followers, -> { joins(:followers).select("followers.*", "COUNT(followers.id) AS follower_count").group(:project_id).order("follower_count DESC") }
end
#app/controllers/projects_controller.rb
def index
@projects = Project.sort_by_followers
end
#app/views/projects/index.html.erb
<ol>
<% @projects.each_with_index do |project, i| %>
<li><%= "Project#{i} | #{project.follower_count} followers" %></li>
<% end %>
</ol>
Mi solución de rescates fue agregar un número entero de seguidores en mi modelo de proyecto
Pero con otro proyecto y las guías de rieles ( http://guides.rubyonrails.org/active_record_querying.html ), finalmente encontré la respuesta a mi solicitud
Project.joins(:relationshipfollows).select(''projects.*, COUNT(followed_id) as user_count'').group(''projects.id'').order(''user_count DESC'')
Project.joins (: relationshipfollows) hará una unión interna. Por lo tanto, los proyectos sin seguidores NO se incluirán en el conjunto de resultados. Necesitas algo como esto:
Project.select("projects.*, COUNT(relationshipfollows.follower_id) as follower_count").joins("LEFT OUTER JOIN relationshipfollows ON relationshipfollows.followed_id = projects.id").group("projects.id").order("follower_count DESC")