Почему моя область ActiveRecord с `merge` возвращает массив?

У меня есть область моей модели Contract, которая использует merge и возвращает массив, а не ActiveRecord::Relation, как я бы хотел.

Да, я видел, что он сказал, что Это ActiveRecord:: Relation, но Rails намеренно лжет вам. Но в этом случае:

  • В области использования merge
  • он работает только в том случае, если последний объект в цепочке
  • Возвращаемый объект говорит об этом классу Array
  • Возвращаемый объект не имеет ничего о ActiveRecord в своих предках
  • Вызов ActiveRecord::Relation методов типа scoped по возвращаемому значению повышает рейзы NoMethodError: undefined method 'scoped' for []:Array.

Объем находится на Contract и выглядит примерно так:

scope :hourly, scoped.merge(Division.find_by_name!('Hourly').contracts)

Почему это возвращает массив? Могу ли я заставить его вернуть ActiveRecord::Relation?

Ответ 1

Ссылайтесь на комментарии выше. Я дал это с фиктивными отношениями, которые, как я ожидаю, у вас есть с подразделением и контрактом.

# app/models/contract.rb

scope :hourly,
  select: 'distinct contracts.*',
  joins: :divisions,
  conditions: {
    "divisions.name" => 'Hourly'
  },
  order: :id

contracts = Contracts.hourly
# => [#<Contract id: 1>, #<Contract id: 2>]

contracts.class
# => #<ActiveRecord::Relation>

contracts.scoped.class
# => #<ActiveRecord::Relation>

contracts.arel
# => #<Arel::SelectManager:0x007fab629f7e90>

contracts.to_a
# => [#<Contract id: 1>, #<Contract id: 2>]

contracts.to_sql
# => SELECT distinct contracts.* FROM `contracts` INNER JOIN `divisions` ON `divisions`.`contract_id` = `contracts`.`id` WHERE `divisions`.`name` = 'Hourly' ORDER BY id

Сообщите мне, если это то, что вы искали...