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 に答える