使用Rails 4更新哈希

时间:2015-10-13 16:18:36

标签: ruby ruby-on-rails-3

我有一个哈希对象:

@chosen_opportunity  = {"id"=>66480, "prize_id"=>4, "admin_user_id"=>1, "created_at"=>2015-09-20 18:37:29 +0200, "updated_at"=>2015-09-20 18:37:29 +0200, "opportunity_available"=>true}

如何将deal_available的值更新为false?

我尝试过但却失败了:

@chosen_opportunity['deal_available'] = false
@chosen_opportunity.save

控制器/ deal_controller.rb:

def show_opportunity
    @deal =  Deal.friendly.find(params[:id])    

    @chosen_opportunity = Opoortunity.find_by_sql(
      " SELECT \"opportunities\".*
        FROM \"opportunities\"
        WHERE (deal_id = #{@deal.id}
        AND opportunity_available = true)
        ORDER BY \"opportunities\".\"id\" ASC LIMIT 1"
    ) 
    # comes from http://apidock.com/rails/ActiveRecord/Base/find_by_sql/class
    @chosen_opportunity[0].attributes['opportunity_available'] = false
    @chosen_opportunity[0].save     


    respond_to do |format|
      format.js 
    end
  end

我可以在Deal控制器内的Opportunity模型中更新opportunity_available的值吗?这就是为什么它不起作用?

我知道我可以使用Active Record但我需要使用原始PostgreSQL进行第一次查询。感谢您对这种非常好的Rails-y方式的理解。

2 个答案:

答案 0 :(得分:2)

您可以将代码更改为:

@chosen_opportunity = Opportunity.find_by deal_id: deal.id, opportunity_available: true
@chosen_opportunity.opportunity_available = false
@chosen_opportunity.save!

这与Rails兼容得多。另外,如果我没有弄错的话,Rails不会让你保存通过find_by_sql获得的对象,所以至少你需要从中获取一个合适的模型对象结果。您可以编写(非常难看)代码,如:

Opportunity.where(id: @chosen_opportunity[0].attributes['id'])
           .update_all(opportunity_available: false)

警告:这将更新数据库,但不会更新@chosen_opportunity[0]对象。

答案 1 :(得分:1)

哈希上没有方法save。您必须在将该哈希保存为实例变量的模型上执行此操作。