ruby-on-rails - 如何使用 rails 和 mongoid 通过关联的 "count"查找记录?

标签 ruby-on-rails mongoid has-many

使用这些模型:

class Week
  has_many :proofs
end
class Proof
  belongs_to :week
end

我想做类似的事情:
Week.where(:proof.count.gt => 0)

仅查找具有多个证明的周。

有一个答案似乎解决了这个问题:

Can rails scopes filter on the number of associated classes for a given field

但在本例中,由于 id 与证明一起存储,因此 Week 中没有诸如 proof_ids 之类的属性。这不起作用,例如:
Week.where(:proof_ids.gt => 0)

这个查询怎么可能?概念上很简单,但我不知道如何用 mongo 或 mongoid 来做到这一点。

同样,我想按证明的数量排序,例如:
Week.desc(:proofs.size)

但这也行不通。

我确实意识到计数器缓存是我的具体问题的一个选项,但我也希望能够进行查询。

在此先感谢您的帮助。

最佳答案

使用 rails(并且没有 counter_cache),您可以执行以下操作:

class Week < ActiveRecord::Base
  has_many :proofs

  def self.by_proofs_size
    sort_by { |week| week.proofs.size }
  end

  def self.with_at_least_n_proofs(n = 1)
    select { |week| week.proofs.size >= n }
  end
end

尽管这些操作中的每一个都会产生 2 个查询,但这远非理想。

使用范围(错误?)重复这对查询(每个操作 => 4 个查询):
scope :with_at_least_n_proofs, -> (n = 1) { select { |w| w.proofs.size >= n } }
scope :by_proofs_size, -> { sort_by { |w| w.proofs.size } }

理想的可能是使用 counter_cache
scope :with_at_least_n_proofs, -> (n = 1) { where('proofs_count >= ?', n) }
scope :by_proofs_size, -> { order(proofs_count: :desc) }

关于ruby-on-rails - 如何使用 rails 和 mongoid 通过关联的 "count"查找记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8223518/

相关文章:

has-many - cakephp 3 beta 中具有 HasMany 关系的分页表

json - 使用 sequelize 防止将连接表数据添加到 json

ruby-on-rails - 在数据库中存储密码

javascript - 如何将动态路由传递给 Rails 中的 AJAX POST 请求

ruby-on-rails - 具有可选字段的模型未保存

Grails - 简单的 hasMany 问题 - 在 create.gsp 中使用复选框而不是 HTML 选择

ruby-on-rails - Windows 上的 ruby : Cannot install mysql2 gem - Failed to build gem native extension

ruby-on-rails - 更改设计消息 "Email has already been taken"

ruby-on-rails - 我如何在 ruby​​ on rails 中生成 mongoid.yml 文件

ruby-on-rails - 更改 Mongoid 中的字段类型而不丢失数据