NoMethodError в RailsAdmin :: MainController # edit - PullRequest
0 голосов
/ 29 января 2019

У меня есть депозит и модели кошелька в моем рельсе admin.Я использую кошелек в модели депозита как:

wal=Wallet.where(user_id: self.user_id)
wal.balance = wal.balance + self.amount
wal.save!

Ошибка:

NoMethodError in RailsAdmin::MainController#edit

Результат

puts wal.inspect

равен

<ActiveRecord::Relation [#<Wallet id: 1, balance: 200, user_id: 22, created_at: "2019-03-20 04:57:45", updated_at: "2019-03-20 06:43:32">]>

Я нашел решение, но я не думаю, что это правильный подход

wal=Wallet.where(user_id: self.user_id)
wal[0].balance = wal[0].balance + self.amount
wal[0].save!

Любая помощь будет оценена.Заранее спасибо.

1 Ответ

0 голосов
/ 20 марта 2019

.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 возвращает только пустой массив отношений.

...