2012-08-24 190 views
0

基本上,我有警報和更新之間的一對多關係。許多更新屬於一個警報。現在我的問題是,我無法更新我的數據庫中的任何記錄。我可以創造一個沒有問題的新紀錄。 Rails記錄器將實際記錄打印到日誌中。正如您從日誌文件中所看到的,@ new_alert檢索應該保存到數據庫的已更改記錄。雖然它說「警報已成功更新」,但它並不會使用新記錄更新舊記錄。當我刪除警報和更新之間的關係時,它可以很好地工作。我想我錯過了Alert或Update模型中的一些東西。(ActiveRecord)update_attributes不更新數據庫記錄

alerts_controller.rb ...

def update 
@alert = Alert.find(params[:id]) 
    @new_alert = params[:alert] 

    Rails.logger.debug "alert_params: #{@new_alert.inspect}" 
    Rails.logger.debug "alert_db: #{@alert.inspect}" 


respond_to do |format| 
    if @alert.update_attributes(params[:alert]) 
    format.html { redirect_to @alert, notice: 'Alert was successfully updated.' } 
    format.json { head :no_content } 
    else 
    format.html { render action: "edit" } 
    format.json { render json: @alert.errors, status: :unprocessable_entity } 
    end 
end 
end... 

Alert.rb

class Alert < ActiveRecord::Base 
    has_many :update 
    accepts_nested_attributes_for :update 
end 

Update.rb

class Update < ActiveRecord::Base 
belongs_to :alert, :foreign_key => 'alert_id' 
end 

(MySQL的)警報表:

CREATE TABLE `alerts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `status_id` int(11) DEFAULT NULL, 
    `date` datetime DEFAULT NULL, 
    `text` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `update_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 

(MySQL的)更新表:

CREATE TABLE `updates` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `alert_id` int(11) DEFAULT NULL, 
    `text` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `date` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 

日誌輸出:

Started PUT "/alerts/4" for 127.0.0.1 at 2012-08-24 15:47:12 +0200 
Processing by AlertsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"GHM+S34PV4o46SpZZm67+mM8Lu9eY/BiWGMjDpwju9c=", "alert"=>{"title"=>"afgaegafga56556", "text"=>"afgafgafgarg", "status_id"=>"2"}, "commit"=>"Update Alert", "id"=>"4"} 
    [1m[35mAlert Load (0.5ms)[0m SELECT `alerts`.* FROM `alerts` WHERE `alerts`.`id` = 4 LIMIT 1 
alert_params: {"title"=>"afgaegafga56556", "text"=>"afgafgafgarg", "status_id"=>"2"} 
alert_db: #<Alert id: 4, status_id: 2, date: "2012-08-22 20:00:19", text: "afgafgafgarg", title: "afgaegafga", update_id: 1> 
    [1m[36m (0.0ms)[0m [1mBEGIN[0m 
    [1m[35mUpdate Load (0.5ms)[0m SELECT `updates`.* FROM `updates` WHERE `updates`.`alert_id` = 4 
    [1m[36m (0.5ms)[0m [1mCOMMIT[0m 
Redirected to http://localhost:3000/alerts/4 
Completed 302 Found in 4ms (ActiveRecord: 1.5ms) 

謝謝!

+1

不知道這是你的問題,但'has_many:update'應該是複數:'has_many:updates',否則關係可能不起作用。 'accept_nested_attributes_for'也是如此。此外(並不重要,但可能很好知道),您不必在與關係名稱匹配時定義外鍵。所以'belongs_to:alert,:foreign_key =>'alert_id''和'belongs_to:alert'完全一樣。 –

+0

工作正常!非常感謝! – user1557892

+0

很高興提供幫助,我會將其放入答案部分,以便您可以關閉該問題。 –

回答

2

has_many :update應該是複數:has_many :updates否則關係可能不起作用。

對於accepts_nested_attributes_for也是如此。

另外(不重要,但可能很好知道),當它與關係名稱匹配時,您不必定義外鍵。因此belongs_to :alert, :foreign_key => 'alert_id'belongs_to :alert完全相同。