我在HABTM关系中有一个通过关联的联接模型(详情如下)。我正在尝试找到一条记录....找到该记录属性的值...更改值并更新记录但是我很难做到这一点。
模型设置为>>
User.rb
has_many :choices
has_many :interests, :through => :choices
Interest.rb
has_many :choices
has_many :users, :through => :choices
Choice.rb
belongs_to :user
belongs_to :interest
和Choice将user_id,interest_id,得分作为字段。
我找到了?对象?像这样>>
@choice = Choice.where(:user_id => @user.id, :interest_id => interest.id)
因此,模型Choice有一个名为:score的属性。如何找到得分列的值....和+ 1 / -1然后重新保存?
我试过
@choice.score = @choice.score + 1
@choice.update_attributes(params[:choice])
flash[:notice] = "Successfully updated choices value."
但是我得到了“未定义的方法得分”......我错过了什么?
答案 0 :(得分:3)
您可能需要使用.first
来运行实际查询并返回结果:
@choice = Choice.where(:user_id => @user.id, :interest_id => interest.id).first
...否则@choice
只保存一个Active Relation对象......它还没有执行查询。
答案 1 :(得分:2)
您的查询将返回一组选项,因此您需要指定.first以获取要更新的实际模型。在更新之前,请务必检查您是否确实抓住了任何对象,这样您就不会尝试更新nil:)
此外,如果您只想增加或减少一个字段,那么您可以使用方法.increment!或.decrement!这将立即更新到数据库。
@choice.increment!(:score)
因为在您的情况下,如果params [:choice]包含分数值,它将覆盖您之前分配的值。
答案 2 :(得分:1)
您已拥有@user对象,因此请使用:
@choice = @ user.choices.find_by_interest_id(interest.id)