tablas relacionadas relacion obtener muchos hasmany español datos consultas belongsto sql ruby-on-rails ruby count has-many-through

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")