Количество запросов не должно быть проблемой. Если у вас много статей и вы часто фильтруете по категориям, вы можете добавить индекс в столбец category
, добавив его к миграции, например:
def change
add_index :articles, :category
end
Ссылка: https://guides.rubyonrails.org/active_record_migrations.html
Вы также можете извлечь категории в их собственную модель / таблицу, как обычно для этого типа данных, и проиндексировать внешний ключ в таблице статей, которая указывает на таблица категорий:
# Create the categories table
def change
create_table :categories do |t|
t.name, null: false, index: {unique: true}
end
end
# Add the foreign key to articles
def change
change_table :articles do |t|
t.references :category, foreign_key: true, index: true, null: false
end
end
# Category model
class Category < ApplicationRecord
has_many :articles
end
# Article model
class Article < ApplicationRecord
belongs_to :category, required: true
scope :by_category, ->(category_name) do
joins(:category).where(categories: {name: category_name})
end
end
# Controller
class ArticlesController < ApplicationController
def index
@news = Article.with_attached_image.by_category('news').last
# etc...
end
end
Кроме того, если вы вообще используете переменную @articles
, рассмотрите возможность использования какой-либо разбивки на страницы (например, kaminari ), поэтому вы не выбираете и не инициализируете все записи в таблице.