gpt4 book ai didi

ruby-on-rails - 如何使用 Rails 3 中的范围通过关联计算唯一记录

转载 作者:数据小太阳 更新时间:2023-10-29 08:09:49 24 4
gpt4 key购买 nike

我写这个是为了计算唯一用户的回复(对帖子)的数量:

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

我尝试将它转换为一个范围,但它抛出一个错误:undefined method 'default_scoped?'对于 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

最佳答案

来自 http://guides.rubyonrails.org/active_record_querying.html#scopes :

All scope methods will return an ActiveRecord::Relation object which will allow for further methods (such as other scopes) to be called on it.

换句话说,返回的结果集需要与其他 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()

或者

IMO,这个问题的一个更优雅的解决方案是在 Post 模型中简单地定义一个实例方法:

def distinct_response_count
responses.count(:user_id, :distinct => true)
end

关于ruby-on-rails - 如何使用 Rails 3 中的范围通过关联计算唯一记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com