Метод коллекции Has_many возвращает пустой массив, если я создаю дочерний объект через другой родительский объект - PullRequest
2 голосов
/ 13 марта 2012

Извините за запутанный заголовок, я не мог объяснить это лучше. Не стесняйтесь редактировать это.

У меня есть такая структура:

class Home < ActiveRecord::Base
 has_many :reservations

end

class User < ActiveRecord::Base
 has_many :reservations

end

class Reservation < ActiveRecord::Base
 belongs_to :user
 belongs_to :home
end

Это означает, что резервирование связано с пользователем, который делает резервирование, и дом, который он бронирует.

Я создаю экземпляры резервирования, как это:

user_instance.reservations.create(:home => home_instance, :dates_and_other_data => ...)

Используя этот метод, резервирование должным образом создается в базе данных, и я могу получить его (с остальными сделанными резервированием пользователем) с помощью

user_instance.reservations

Но, если я попытаюсь извлечь его из домашнего экземпляра, который я использовал в качестве параметра, например:

home_instance.reservations 

Возвращает пустой массив. Также происходит обратное (я не могу получить резервирование из экземпляра пользователя, если я создаю его из домов).

Что я делаю не так?

Разве эти два предложения не совпадают?

Reservation.create(:user => user, :home => home, :other_stuff)
User.reservations.create(:home => home, :other_stuff)

1 Ответ

3 голосов
/ 13 марта 2012

Пользовательская модель не может знать, что вы только что создали резервирование из домашней модели, и наоборот.Когда вы впервые получаете доступ к ассоциации, ActiveRecord запоминает результат этого вызова, поэтому нет необходимости вызывать базу данных каждый раз, когда вы впоследствии используете эту связь.

home_instance.reservations   # This will pull from the databse, and store the
                             # results in a variable.

# This will create a new reservation record in the database.
user_instance.reservations.create(:home => home_instance, :dates_and_other_data => ...)

home_instance.reservations   # We don't go to the database here, since we already
                             # have the stored variable. So we don't see the new
                             # reservation.

Вы можете обойти это, передав true в качестве аргумента ассоциации has_many, например:

home_instance.reservations(true)  # The true forces ActiveRecord to requery the DB>
...