面对一个我完全无法理解的问题。使用方法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岁的人。这可能会得到零行、一行或多行,但你总是会得到一个关系,这是肯定的。