2015-10-13 105 views
-1

我有一個哈希對象:更新哈希與軌道4

@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的值更新爲假?

我試過,但它失敗:

@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 

我可以更新opportunity_available從新政控制器內部的機遇模型中的價值?這就是爲什麼它不起作用?

我知道我可以使用Active Record,但我需要使用原始的PostgreSQL進行第一次查詢。感謝您對這種非Rails-y方式的理解。

+2

您肯定需要使用ActiveRecord。我看到你的其他帖子(http://stackoverflow.com/questions/33106585/rails-4-postgresql-9-4-query-and-update-a-ruby-object-inside-an-array),你是通過做一個原始的SQL查詢來獲得這個散列,這個查詢可以很容易地用ActiveRecord完成。而Activercord對象可以更新數據庫,這就是他們的意圖。 – Caillou

+0

不是非常Rails-y,但應該可以使用原始的postgresql。堅持試圖設法讓這個與postgresql一起工作。 – Mathieu

+0

同意原始SQL需要轉換爲使用ORM。使用ORM的一個要點是添加數據庫抽象層,使您可以輕鬆地將應用程序從一個DBM移動到另一個DBM。只要添加原始SQL,您就開始將自己綁定到特定的DBM並使其難以移動。 –

回答

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]對象。

+0

是否有其他類型的散列比純哈希?我的散列來自find_by_sql方法,輸出一個對象http://apidock.com/rails/ActiveRecord/Base/find_by_sql/class。處理問題[0] .attributes =>本地輸出{「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,「deal_available」=> true}。這就是你所說的一個簡單的散列?所以更新它我使用處理問題[0] .attributes ['deal_available'] = false但它不起作用 – Mathieu

+0

也許它有處理Rails 4 params_permit和強大的參數,不讓我更新值,但我是沒有得到任何強烈的參數錯誤在我的commande終端... – Mathieu

+0

所以基本上你只是試圖更新數據庫中的模型。你能發佈你的完整代碼,包括你從數據庫中獲取對象的部分嗎? – davidrac

1

散列上沒有方法save。您必須在將該散列保存爲實例變量的模型上執行此操作。