#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)
, чтобы он не выполнял запрос к базе данных и использовал уже загруженную коллекцию.