Rails - 如何更新连接模型中的记录值?

时间:2011-01-07 02:38:05

标签: ruby-on-rails

我在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."

但是我得到了“未定义的方法得分”......我错过了什么?

3 个答案:

答案 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)