查找大于特定关联x的所有对象

时间:2015-04-16 04:43:39

标签: ruby-on-rails ruby activerecord

我有很多Farms,每个农场都有很多animals。我需要找到每个有超过5只动物的农场。

我需要一些与此相符的东西......:

Farm.where(animals.count > 5)  

更新/答案:

Farm.joins(:animals).group("farm_id").having("count(farm_id) > 5")

2 个答案:

答案 0 :(得分:8)

尝试:

Farm.joins(:animals).group("farm.id").having("count(animals.id) > ?",5)

参考:https://stackoverflow.com/a/9370734/429758

答案 1 :(得分:5)

考虑在Farm上实施counter_cache - >动物

class Farm < ActiveRecord::Base
  has_many :animals
end

class Animal < ActiveRecord::Base
  belongs_to :farm, counter_cache: true
end

不要忘记将animals_count(整数)添加到farms表格。

class AddAnimalCounterCacheToFarm < ActiveRecord::Migration
  def up
    add_column :farms, :animals_count, :integer
    # if you need to populate for existing data
    Farm.reset_column_information
    Farm.find_each |farm|
      farm.update_attribute :animals_count, farm.animals.length
    end
  end

  def down
    remove_column :farms, :animals_count
  end
end

寻找有5个或更多动物的农场

Farm.where("farms.animals_count >= 5")