0

我想选择最多用户使用的资源。

模型:

class Resource < ActiveRecord::Base
  has_many :users, :through => :kits
  has_many :kits

class User < ActiveRecord::Base
  has_many :resources, :through => :kits
  has_many :kits, :dependent => :destroy

class Kit < ActiveRecord::Base

  belongs_to :resource
  belongs_to :user

我想创建一个范围来选择那些 resource.users.count > 3 的资源

我怎样才能在 Rails 中做到这一点?

谢谢

我正在接近但仍有一些问题:

scope :most, group('resources.id, resources.title, resources.url, resources.description, resources.author, resources.price, resources.created_at, resources.updated_at').joins(:users).having("count(user_id) > ?",5)

我必须包含资源的所有字段,因为 Postgresql 给出如下错误:

ActiveRecord::StatementInvalid: PG::Error: ERROR:  column "resources.category_id" must appear in the GROUP BY clause or be used in an aggregate function

必须有一种方法可以包含所有字段,而不必输入每个字段

4

2 回答 2

0

这将起作用,尽管效率有点低:

在 Resource 类中,创建一个遍历每个资源的类方法,并将每个拥有超过“num”个用户的资源附加到一个数组中。

def self.more_than_x_users(num)
  resource_list = []
  Resource.all.each |res|
    if res.users.count > num
      resource_list << res
    end
  end
  return resource_list
end

另一种方法是使用find带有 :select 和 :group 的方法,如本文中所建议的那样,但是您仍然需要将返回的外键转换为对象。我会保持简单并采用上述解决方案。

编辑
在尝试了一些事情之后,我认为这可能会对您有所帮助:
在您的Kit班级中添加一个范围,如下所示:

scope :most_used, group(:resource_id).having("count(user_id) > 3")

如果由于我的字段错误而这不起作用,请考虑如何在 SQL 语句中执行此操作,并尝试通过链接类似于我的命令来复制我给您的内容。如果您仍然卡住,请粘贴您的 SQL 语句,我会为您将其转换为范围。

希望这可以帮助

于 2012-06-13T08:58:31.370 回答
0

这应该有效:

class Resource < ActiveRecord::Base
  def popular_resources
    joins(:users).where("users.count > '3'")
  end
于 2012-06-13T14:41:18.120 回答