为什么"where"方法不起作用,不像"查找"?



面对一个我完全无法理解的问题。使用方法where时出现错误。

@winner = Team.where(id: params[:winner_id])
@winner.update(rating: @winner.rating += 20)
undefined method `rating' for #<Team::ActiveRecord_Relation:0x00007faed9018490>

但是,如果我将@winner = Team.where(id: params[:winner_id])更改为@winner = Team.find(params[:winner_id]),它将起作用。

为什么where方法不起作用?

因为where总是给你一个ActiveRecord_Relation,而不是一个对象。在你的情况下,你在过滤id,所以如果这是主键,就像我想的那样,你只会得到一条记录,但无论如何,这都是一个关系,因为这是where的语义。

@winner = Team.where(id: params[:winner_id]).first

@winner = Team.find_by(id: params[:winner_id])

其中一个应该做技巧

where是这样工作的,因为您甚至可以筛选一些不那么严格的列,并在返回中获得许多行,所以您总是获得行的集合。例如,想想这个

@people = Person.where(age: 20)

这个查询检索所有20岁的人。这可能会得到零行、一行或多行,但你总是会得到一个关系,这是肯定的。

最新更新