.where
всегда возвращает отношение, а не объект.Отношение в основном представляет собой массив объектов.Независимо от того, если ваш поиск возвращает один, ноль или много объектов.
Таким образом, чистый способ сделать это похож на ваш подход.Вы просто выбираете объект в позиции индекса 0 массива отношений.
wal = Wallet.where(user_id: self.user_id).first
Другой подход может заключаться в добавлении отношения в пользовательскую модель.Предполагается, что вы убедитесь, что у пользователя всегда есть только один кошелек, а у вас есть доступный пользователь.
# model
has_one :wallet
# controller
user = User.find(self.user_id)
wal = user.wallet
Функция Find всегда возвращает один объект (если он существует), поскольку он может быть только один.Также подход может быть .find_by
.Это похоже на поиск, но работает для других полей объекта.Для этого вы должны убедиться, что для каждого пользователя существует только один кошелек, поскольку find_by
возвращает только первый объект, даже если есть несколько объектов, соответствующих запросу.
Wallet.find_by(user_id: self.user_id)
В последних 2 примерах естьпреимущество в том, что они возвращают ActiveRecord::RecordNotFound
, когда нет совпадений..where
возвращает только пустой массив отношений.