RSpec has_many через # на after_save

#ruby-on-rails #ruby #activerecord

#ruby-on-rails #рубин #activerecord

Вопрос:

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

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

В спецификации я создаю адрес с помощью address_aliases. В моем последующем сохранении адреса я где-то использовал 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. Вы сохраняете адрес, но не псевдонимы. Итак, pluck (правильно) ничего не находит в БД.

2. Также попробуйте создать наоборот: сначала адрес, затем передайте этот адрес псевдонимам.

3. @SergioTulentsev Я не могу создавать address_aliases отдельно, потому что у меня еще нет идентификатора адреса. Если я создам address_alias после адреса, это сработает, но я больше не получу address_alias после сохранения адреса. Пробовал и наоборот … все то же самое

Ответ №1:

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

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