В настоящее время я пытаюсь минимизировать количество запросов SQL в приложении rails. И использовал область для фильтрации записей и обнаружил, что в моем журнале сервера область запускает SQL-запрос, хотя он показывает CACHE (0,00 мс), даже если он фильтрует запись, используя атрибуты записи. (например, фильтрация с использованием obj.status)
Я пытался использовать метод класса в модели, опять же, когда я звоню
def pdf_files
all.select(&:pdf?)
end
прицелы,
scope :pdf_files, -> { all.select(&:pdf?) }
запускает запрос sql.
Я попытался переопределить ActiveRecord :: Associations :: CollectionProxy, чтобы включить этот метод, например,
class ActiveRecord::Associations::CollectionProxy
def pdf_files
to_a.select(&:pdf?)
end
end
сработало , но этот метод также можно вызвать из другой модели.
Я пытался использовать блоки, чтобы расширить ваши ассоциации с помощью дополнительных методов, например.
has_many :files, do
def pdf_files
to_a.select(&:pdf?)
end
end
У меня работает , он выбирает файлы без какого-либо SQL-запроса.
Но дело в том. Мне нужны эти методы, доступные только для файловой модели, так как эти методы требуются для всех других моделей, связанных с файловой моделью, и я не хочу нарушать соглашение по рельсам, например, @email.files.pdf.
Также обнаружил, что в консоли рельсов,
когда я набираю File :: ProxyCollection, это дает мне ActiveRecord :: Associations :: CollectionProxy. Но не знаю, как добавить к нему метод.
Я хочу иметь возможность звонить @email.files.pdf ?, @ email.files.doc? , чтобы отфильтровать результаты, не выполняя вообще никакого запроса, даже если он вызывает CACHE SQL Query .
Модель Определения
class TestFile < ApplicationRecord
belongs_to :fileable, polymorphic: true, optional: true
scope :document_files, -> { all.select(&:document?) }
scope :ebook_files, -> { all.select(&:ebook?) }
enum file_type: [:document, :ebook, :paper, :article, :picture]
end
class TestEmail < ApplicationRecord
has_many :test_files, as: :fileable
end
class TestPost < ApplicationRecord
has_many :test_files, as: :fileable
end
в консоли
email = TestEmail.includes(:test_files).first
document_files = email.test_files.document_files
Запрос, выполненный для области действия document_files:
Но если я сделаю что-то вроде,
class TestFile < ApplicationRecord
belongs_to :fileable, polymorphic: true, optional: true
enum file_type: [:document, :ebook, :paper, :article, :picture]
end
class TestEmail < ApplicationRecord
has_many :test_files, as: :fileable do
def document_files
to_a.select(&:document?)
end
end
end
class TestPost < ApplicationRecord
has_many :test_files, as: :fileable do
def document_files
to_a.select(&:document?)
end
end
end
результат загружается без запроса