Проблема: У меня есть две модели с именами Contract
и Appendix
.Последний имеет область действия persisted
для исключения непостоянных объектов.Я хотел бы написать спецификацию для области, но, похоже, я вообще не могу получить доступ к непостоянным ассоциациям внутри спецификаций.
Модели:
class Contract < ApplicationRecord
has_many :appendixes
end
class Appendix < ApplicationRecord
belongs_to :contract
scope :persisted, -> { where 'id IS NOT NULL' }
end
Спецификация модели приложения:
context 'within persisted scope' do
it 'returns only persisted appendixes' do
contract = Contract.create(attributes_for(:contract))
Appendix.create(attributes_for(:appendix, contract: contract))
contract.appendixes.new
byebug
end
end
Примеры:
Когда достигается точка останова byebug, contract.appendixes
возвращает то же, что и contract.appendixes.persisted
, несмотря натот факт, что перед byebug инициализируется новое непостоянное приложение, и это должно иметь значение (?):
(byebug) contract.appendixes
#<ActiveRecord::Associations::CollectionProxy []>
(byebug) contract.appendixes.persisted
#<ActiveRecord::AssociationRelation []>
Между тем, при повторении той же спецификации в консоли rails, она работает как положено:
2.5.1 :061 > c = Contract.last
2.5.1 :062 > c.appendixes
=> #<ActiveRecord::Associations::CollectionProxy []>
2.5.1 :063 > c.appendixes.new
=> #<Appendix id: nil, ...
2.5.1 :064 > c.appendixes
=> #<ActiveRecord::Associations::CollectionProxy [#<Appendix id: nil, ...
2.5.1 :065 > c.appendixes.persisted
Appendix Load (1.6ms) SELECT "appendixes".* FROM "appendixes" WHERE "appendixes"."contract_id" = $1 AND (id IS NOT NULL) LIMIT $2 [["contract_id", "b3a1645b-d4b1-4f80-9c43-6ddf3f3b7aba"], ["LIMIT", 11]]
=> #<ActiveRecord::AssociationRelation []>
Я использую FactoryBot атрибуты для инициализации объектов непосредственно в БД на всякий случай (ранее я полностью инициализировал объект через FactoryBot, но потом подумал, что FactoryBot может не взаимодействовать с БД обычным способом, этотакже сказано в документации FactoryBot ).
Вопрос: Как я могу прочитать непостоянные приложения из объекта контракта в моих спецификациях?
Я использую:
- Ruby 2.5.1p57
- Rails 5.1.6
- RSpec 3.8.0
- FactoryBot 4.11.0
- FactoryBotRails 4.11.0