RailsAdmin :: MainController#edit中的NoMethodError

时间:2019-01-29 05:12:13

标签: ruby-on-rails-5 rails-admin

我的rails管理员中有存款和钱包模型。我在存款模式中使用的钱包是:

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 :(得分:1)

.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_by。它与find类似,但适用于其他对象字段。为此,您必须确保每个用户只有一个钱包,因为find_by仅返回第一个对象,即使有多个与查询匹配的对象也是如此。

Wallet.find_by(user_id: self.user_id)

最后2个示例的优势在于,如果没有匹配项,它们将返回ActiveRecord::RecordNotFound.where仅返回一个空的关系数组。