Ruby on rails 如何通过“查找”找到记录;计数“;使用rails和mongoid的关联性?
对于这些型号:Ruby on rails 如何通过“查找”找到记录;计数“;使用rails和mongoid的关联性?,ruby-on-rails,mongoid,has-many,Ruby On Rails,Mongoid,Has Many,对于这些型号: class Week has_many :proofs end class Proof belongs_to :week end 我想做一些类似的事情: Week.where(:proof.count.gt => 0) 只找到有多个证据的星期 有一个答案似乎可以解决这个问题: 但在本例中,由于ID与证明一起存储,因此没有“每周证明ID”这样的属性。这不起作用,例如: Week.where(:proof_ids.gt => 0) 这个查询怎么可能?概念上
class Week
has_many :proofs
end
class Proof
belongs_to :week
end
我想做一些类似的事情:
Week.where(:proof.count.gt => 0)
只找到有多个证据的星期
有一个答案似乎可以解决这个问题:
但在本例中,由于ID与证明一起存储,因此没有“每周证明ID”这样的属性。这不起作用,例如:
Week.where(:proof_ids.gt => 0)
这个查询怎么可能?概念上很简单,但我不知道如何使用mongo或mongoid实现这一点
类似地,我想按证据的数量排序,例如:
Week.desc(:proofs.size)
但这也不起作用
我确实意识到计数器缓存是我的两个具体问题的一个选项,但我也希望能够进行查询
提前感谢您的帮助。如果我离您太远了,请原谅-您能使用weeks表中的简单计数器缓存吗?然后你可以做一些像week.proof\u count这样的事情。使用rails(没有计数器缓存),你可以做:
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
理想情况可能是使用计数器缓存
scope :with_at_least_n_proofs, -> (n = 1) { where('proofs_count >= ?', n) }
scope :by_proofs_size, -> { order(proofs_count: :desc) }
我不知道这是否是最好的解决方案,因为它通过一个数组来映射它,但这样做了:(这里提到的其他解决方案给了我例外)
classweek{any_in(:_id=>includes(:proof)。选择{w | w.proof.size>0}.map{r | r.id}}
结束
是的,正如我在问题中所说的,我知道计数器缓存是一个选项,但在这种情况下,如果可能的话,我宁愿进行查询。如果这不起作用,那么我肯定会做计数器缓存。你可以删除include(:proof)来提高性能。目前,您正在将所有数据加载到:proof中,而您真正需要的是一个快速计数查询。试一试。它会扼杀你的申请,因为你将收到从数据库到内存的所有证据application@antiqe这就是我提到使用计数器缓存的原因
scope :with_at_least_n_proofs, -> (n = 1) { where('proofs_count >= ?', n) }
scope :by_proofs_size, -> { order(proofs_count: :desc) }
class Week < ActiveRecord::Base
scope :has_proofs, -> { any_in(:_id => includes(:proofs).select{ |w| w.proofs.size > 0 }.map{ |r| r.id }) }
end