У мене є масив об'єктів, назвемо його an Indicator
. Я хочу запустити def self.subjects
на цьому масиві методи класу Indicator (методи сорту, області застосування тощо). Єдиний спосіб, яким я знаю запускати методи класу на групі об'єктів, це мати їх ActiveRecord :: Relation. Тож я закінчую вдаватися до додавання to_indicators
методу до Array
.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
Іноді я ланцюжком досить багато таких областей, щоб відфільтрувати результати, в межах методів класу. Отже, навіть якщо я називаю метод на ActiveRecord :: Relation, я не знаю, як отримати доступ до цього об’єкта. Я можу дістатись лише до вмісту all
. Але all
це масив. Тож мені доведеться перетворити цей масив в ActiveRecord :: Relation. Наприклад, це частина одного з методів:
all.to_indicators.applicable_for_bank(id).each do |indicator|
total += indicator.residual_risk_for(id)
indicator_count += 1 if indicator.completed_by?(id)
end
Я думаю, це зводиться до двох питань.
- Як я можу перетворити масив об'єктів у ActiveRecord :: відношення? Переважно, не роблячи
where
кожного разу. - Під час запуску
def self.subjects
типу типу на ActiveRecord :: Relation, як я можу отримати доступ до самого об'єкта ActiveRecord :: Relation?
Дякую. Якщо мені потрібно щось уточнити, дайте мені знати.
.all
, просто використовуйте,.scoped
як вказано у відповіді Ендрю Маршалла (Хоча в рейках 4 він буде працювати.all
). Якщо вам доведеться перетворити масив у відношення, ви десь помилилися ...