2013-04-01 71 views
0

表:ActiveRecord的:在補丁更新外鍵

apps: 
ID (PK) 
name 
status_id (FK to status table) 

status: 
ID(PK) 
name 


class App < ActiveRecord::Base 
    belongs_to :status 
end 

class Status < ActiveRecord::Base 
    has_many :apps 
end 

我有幾個狀態。

Name  PK 
Unreviewed (1) 
Reviewed (2) 
Beta  (3) 

我想將狀態爲'測試版'的所有應用狀態更改爲狀態'未審覈'。主鍵是存儲在Apps表中的內容。但是我不想只是PK的關鍵,因爲它可能在所有數據庫中都不完全相同。我想關閉更新的狀態名稱。

我似乎無法弄清楚如何在Apps表上發出update_all。

嘗試這樣做,但它不工作 App.update_all(:狀態=> '測試',:狀態=> '測試版')

+0

你可以發表你的模型看起來怎麼樣,有什麼屬性 – Zippie

回答

0

嘗試App.update_all("appstatus = 'Tested'", "appstatus = 'Beta'")update_all的第一部分是你設定的,第二部分是條件。我不認爲使用散列火箭與update_all工程設置的價值和條件,你有它。

基於更新問題文本:

App.includes(:status).where("statuses.name = ?", 'Beta').update_all(["apps.status_id = ?", Status.find_by_name('Tested')]) 

你也可以做一些事情:

testing_status = Status.find_by_name('Testing') 
App.update_all(['status_id = ?', testing_status.id], 'status_id = 3') 

基於你想做什麼,我真的建議只是使狀態作爲App模型中的字符串。它會讓你的生活變得更容易。

class App < ActiveRecord::Base 

    STATUSES = {:testing => 'Testing', :unreviewed => 'Unreviewed', :reviewed => 'Reviewed', :beta => 'Beta'] 

    # then you can create scopes to help you 
    STATUSES.each do |status_type, status_value| 
    scope status_type, lambda { where(:status => status_value) } 
    end 
end 

然後,當你想要做一個批量更新:

App.beta.update_all("status = ?", App::STATUSES[:testing]) 
+0

PG ::錯誤:錯誤:列「其appStatus」不存在 LINE 1:UPDATE「apps」SET appstatus ='Tested'WHERE(appstatus ='B ...我想因爲appstatus並不存在於數據庫中,那就是ActiveRecords關係名稱 – lostintranslation

+0

我不確定這是否會工作(因爲我目前沒有什麼可以測試的),但是'App.includes(:status).where(「statuses.name =?」,'Beta')。update_all([「apps.status_id =?」 Status.fi nd_by_name('Tested')])' – spullen

+0

App.includes(:status).where(「statuses.name =?」,'Beta')。update_all([「apps.status_id =?」,Status.find_by_name('Tested ')])仍然不起作用。什麼是'statuses.name'? – lostintranslation