2014-03-28 2 views
0

Я использую Rails 4. У меня есть приложение, где у меня есть много-ко-многим:Заказывайте граф на has_many: через

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 

Я этот учебный курс: http://ruby.railstutorial.org/chapters/following-users?version=3.0#top

Но теперь я Я хотел бы перечислить все проекты, упорядоченные по количеству последователей. Как это:

1. project1 | 99 followers 
2. project2 | 16 followers 
3. project3 | 2 followers 
... 

Я новичок на рельсы, и я предполагаю, что я продолжаю делать ошибки, потому что я стараюсь много примеров, как это: Rails 3 Order By Count on has_many :through или has_many , through: relationship count

я попробовать этот метод: Project.joins(:relationshipfollows).group("relationshipfollows.project_id").order("count(relationshipfollows.project_id) desc")

Но у меня есть эта ошибка: 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

И я попробовать другой метод:

Project.joins(:relationshipfollow).select('following.*, COUNT(followers.id) AS user_count').group('project_id').order('COUNT(followers.id) DESC') 

Но у меня есть эта ошибка: Association named 'relationshipfollow' was not found on Project; perhaps you misspelled it?

Может кто-то пожалуйста, помогите мне найти правильное направление, как сделать все это работать?

сердечным приветом

Edit: Я думаю, что проблема его здесь. Когда я пытаюсь это:

Relationshipfollow.select(:followed_id, "COUNT(follower_id) AS total").group(:followed_id).order("total DESC") 

он вернуть мне это:

=> # ActiveRecord::Relation [# Relationshipfollow id: nil, followed_id: 2, # Relationshipfollow id: nil, followed_id: 1, # Relationshipfollow id: nil, followed_id: 3]

Все проекты отсортированы по числу последователей и всех followed_id (проектов) находятся в хорошем состоянии в относительно моего теста. Но когда я присоединиться к этой моей модели проекта, как это:

Project.joins(:relationshipfollows).select(:followed_id, "COUNT(follower_id) AS total").group(:followed_id).order("total DESC") 

он вернуть мне список проектов, но с PROJECT_ID NULL:

=> #ActiveRecord::Relation [# Project id: nil, # Project id: nil, # Project id: nil] 
+0

, что вы на самом деле хотите делать с запросами и что является результатом методов ActiveRecord ?? –

+0

Я редактировал свой пост для большей ясности. Я хотел бы найти запросы для возврата списка проекта, заказанного по числу последователей.Я пробовал два разных метода (запросы), но никто не работал. Может быть, потому, что я ошибаюсь. – Bibou

+0

попробуйте этот 'Project.joins (: relationshipfollows) .select ('follow. *, COUNT (followers.id) AS user_count'). Group ('project_id'). Order ('COUNT (followers.id) DESC')' и дайте мне знать результат –

ответ

-1

Решения для моего спасения заключались в том, чтобы добавить целую цифру в мою модель проекта

Но с другим проектом и Рельсы направляющие (http://guides.rubyonrails.org/active_record_querying.html), я, наконец, нашел ответ на мой запрос

Project.joins(:relationshipfollows).select('projects.*, COUNT(followed_id) as user_count').group('projects.id').order('user_count DESC') 
+0

Это не будет включать проекты, у которых нет подписчиков. – psparrow

1

Вот что я хотел бы сделать:

#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> 
+0

Здравствуйте, Рич Пек, и благодарю вас за помощь. С помощью вашего метода у меня есть эта ошибка: 'ActiveRecord :: StatementInvalid в категориях # show SQLite3 :: SQLException: нет такой таблицы: последователи: последователи SELECT. *, COUNT (followers.id) AS follower_count FROM" projects "INNER JOIN" relationshipfollows «ON» соответствует «.» Follow_id «=« projects ».» Id «INNER JOIN» users «ON» users ».« Id »=« relationshipfollows ».« Follower_id »GROUP BY project_id ORDER BY follower_count DESC' в этой строке: '<% @ mostfollow.each_with_index do | project, i | %> 'Я действительно не знаю, что произойдет, и где моя ошибка. – Bibou

+0

Я отредактировал мое сообщение. Может быть, мой тест даст вам больше информации о моей ошибке. – Bibou

0

Project.joins (: relationshipfollows) будет делать внутреннее соединение. Таким образом, проекты без последователей НЕ будут включены в результирующий набор. Вам нужно что-то вроде этого:

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") 
Смежные вопросы