3

ユニーク ユーザーによる (投稿に対する) 応答の数をカウントするために、これを書きました。

p = Post.find 1
r = p.responses.count(:user_id, distinct: true)

スコープに変換しようとしましたが、エラーがスローされます。undefined method 'default_scoped?' for 30:Fixnum

class Response < ActiveRecord::Base
  belongs_to :author, class_name: 'User', foreign_key: 'user_id'
  belongs_to :post

  scope :by_unique_users, joins(:post).count(:user_id, distinct: true)
end

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :responses
end

class User < ActiveRecord::Base
  has_many :posts
  has_many :responses
end
4

1 に答える 1

1

http://guides.rubyonrails.org/active_record_querying.html#scopesから:

すべてのスコープ メソッドは ActiveRecord::Relation オブジェクトを返します。これにより、さらにメソッド (他のスコープなど) を呼び出すことができます。

つまり、返された結果セットは、他の Active Record メソッド呼び出しと連鎖可能である必要があります。計算は連鎖できないため、エラーが発生します。そうは言っても、絶対にスコープを使用したい場合は、チェーン可能にする必要があります。

class Response < ActiveRecord::Base
  scope :unique_responses_for_post, lambda {|post_id| where("post_id = ?", post_id).select(:user_id).uniq }
end

必要に応じて名前を変更できます。機能に応じて名前を付けました。その新しいスコープを定義すると、次のことができます。

p = Post.find 1
r = Responses.unique_responses_for_post(p.id).count()

あるいは

PostIMO、この問題のより洗練された解決策は、モデル内でインスタンス メソッドを定義することです。

def distinct_response_count
  responses.count(:user_id, :distinct => true)
end 
于 2012-10-22T15:31:17.230 に答える