Найти родителей без или с детьми в полиморфных ассоциациях в рельсах - PullRequest
0 голосов
/ 21 июня 2010

У меня есть две модели: машины и картинки в моем проекте RoR

class Car < ActiveRecord::Base
  has_many :pictures, :as => :imageable, :dependent => :destroy
end

и

class Picture < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true, :dependent => :destroy
end

Как мне найти все машины только с детскими картинками?

Ответы [ 2 ]

2 голосов
/ 21 июня 2010

Я не проверял это, но думаю, что-то подобное сделало бы это в одном запросе.

class Car < ActiveRecord::Base
    has_many :pictures, :as => :imageable, :dependent => :destroy
    named_scope :with_child_picture, lambda { { 
        :joins => :pictures, 
        :group => "pictures.imageable_id", 
        :conditions => ["pictures.imageable_id != ?", nil] 
    } }
end

И вы можете использовать его как

Car.with_child_picture

Iне мог проверить это сам ... но я надеюсь, что по крайней мере это даст вам представление.

0 голосов
/ 21 июня 2010

Это может стать грязным / медленным, но один из вариантов - перебрать все машины и проверить, совпадает ли количество детей.

good_cars = []
Cars.all.each do |car|
  if (car.pictures.count > 0 && car.pictures.count == Picture.find_by_car_id(car.id).count)
    good_cars << car
  end
end

Или если вы хотите повысить производительность

good_cars = []
Cars.all.each do |car|
 if (car.pictures.count > 0)
    pic_count_for_car = Picture.count_by_sql(
      "SELECT COUNT(*) from pictures WHERE car_id = #{car.id}"
    )
    if (car.pictures.count == pic_count_for_car) 
      good_cars << car
    end
  end
end
...