Порядок следования рельсов по номеру связанного объекта - PullRequest
0 голосов
/ 09 августа 2010

Возможно, заголовок этого вопроса немного устарел, но ближе всего я могу понять, что я пытаюсь сделать.

У меня есть модель продуктов, которая имеет комментарии. Я ищу способ получить 10 лучших продуктов с наибольшим количеством комментариев. Это возможно?

На данный момент у меня есть:

Product.find(:all, :limit => 10)

Это дает мне мои 10 продуктов, но, очевидно, не учитывает, сколько комментариев имеет каждый продукт.

Приветствия

Eef

Ответы [ 3 ]

1 голос
/ 09 августа 2010

В качестве альтернативы, если вы не хотите изменять свою модель, вы можете использовать find_by_sql, чтобы указать подвыбор, который скажет вам, сколько комментариев имеет каждый продукт и порядок его размещения. Э.Г.

Post.find_by_sql("SELECT products.*
  FROM products, (SELECT COUNT(*) 
    FROM comments WHERE comments.product_id = products.id) AS product_comment_count
  ORDER BY product_comment_count DESC
  LIMIT 10")

Возможно, вам потребуется изменить синтаксис, чтобы он соответствовал используемой вами СУБД.

1 голос
/ 09 августа 2010

Если у вас есть столбец кэша счетчика в Product for Comment, тогда вы можете сделать это с помощью простого :order_by в этом столбце.

Редактировать: Принимая во внимание комментарий животного:

class Product < ActiveRecord::Base
  has_many :comments,
    :counter_cache => true
end

Вам понадобится столбец на products с именем comments_count:

add_column :products, :comments_count, :integer, :null => false, :default => 0
0 голосов
/ 09 августа 2010

Попробуйте это:

Product.all(:select=> "products.*, COUNT(products.id) AS comments_count",
            :joins => :comments, 
            :group => "products.id", 
            :order => "comments_count",
            :limit => 10)

Результат сортируется по количеству комментариев, и вы можете получить доступ к comments_count следующим образом:

@products.each do |product|
  p product.comments_count
end

Убедитесь, что вы проиндексировали столбец product_id в таблице comments.

Примечание:

Я бы использовал функцию counter_cache для этого требования (как предложено @tadman).

...