Единственный надежный способ отфильтровать их - это несколько уродливый метод извлечения всех записей и их запуска через выборку:
display_ready_products = Product.all.select(&:display_ready?)
Это крайне неэффективно, особенно если у вас есть большое количество продуктов, которые, вероятно, не подойдут.
Лучший способ сделать это - создать кеш счетчика для ваших фотографий, а также установить флаг при загрузке файла:
class Product < ActiveRecord::Base
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :product, :counter_cache => true
end
Вам необходимо добавить столбец в таблицу Product:
add_column :products, :photos_count, :default => 0
Это даст вам столбец с количеством фотографий. Есть способ предварительно заполнить эти счетчики правильными числами в начале вместо нуля, но здесь нет необходимости вдаваться в это.
Добавить столбец для записи вашего файла флаг:
add_column :products, :file_exists, :boolean, :null => false, :default => false
Теперь активируйте это при сохранении:
class Product < ActiveRecord::Base
before_save :assign_file_exists_flag
protected
def assign_file_exists_flag
self.file_exists = File.exist?(self.file.path)
end
end
Поскольку эти два атрибута отображаются в столбцах базы данных, теперь вы можете напрямую запросить их:
Product.find(:all, :conditions => 'file_exists=1 AND photos_count>0')
Вы можете исправить это, написав две именованные области, которые будут инкапсулировать это поведение.