我有一个哈希对象:
@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方式的理解。
答案 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
。您必须在将该哈希保存为实例变量的模型上执行此操作。