Почему моя область 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
Сообщите мне, если это то, что вы искали...