RSpec has_many через # <ActiveRecord :: Associations :: CollectionProxy> в after_save - PullRequest
0 голосов
/ 22 апреля 2019

Вот моя модель отношений

class Address < ApplicationRecord
    has_many :address_aliases, :inverse_of => :address, :foreign_key => :address_id
end

В спецификации я создаю адрес с помощью address_aliases.В моем after_save адреса я где-то использовал address.address_aliases.pluck, и он не дает правильного значения.

address_aliases = FactoryGirl.build_list(:address_alias, 1, :alias_for_city => "TEST1")
address = FactoryGirl.build(:some_address, :company_id => "test_company", :address_aliases => address_aliases)
byebug
expect ...
address.save!

Это то, что я получаю на byebug.address.address_aliases имеет один элемент, но когда я собираю его, он возвращает пустой массив.

(byebug) address.address_aliases
#<ActiveRecord::Associations::CollectionProxy [#<AddressAlias id: nil, alias_for_city: "TEST1", created_at: nil, updated_at: nil, address_id: nil>]>
(byebug) address.address_aliases.pluck(:alias_for_city)
[]

1 Ответ

1 голос
/ 22 апреля 2019

Проблема в том, что псевдонимы еще не сохранены и pluck делает запрос к базе данных (смотрите, когда вы проверяете address_aliases, запись еще не имеет идентификатора, она находится в памяти, ее еще нет в базе данных) .

Замените pluck на map(&:alias_for_city), чтобы он не выполнял запрос к базе данных и использовал уже загруженную коллекцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...