2013-10-18 77 views
0

我有兩個型號UserMotor,每個表有一個name列。我有一個用戶頁面,顯示用戶擁有的所有電機。更新所有其他記錄如果一條記錄發生變化

我做的方式,它是如此的Motor表的name列等於給name列在表User

Motor    User 
name1    name1 
name3    name2 
name1    name3 
name1    name4 
name4    name5 

所以尋找到name1的頁面時,你會看到所有的記錄名稱爲name1Motor

但是,當我想要更新User表中的名稱時,如何更改應該與user關聯的Motor表中的所有記錄?

所以,如果我改變name1喜歡last1,我該如何改變這一切name1年代到last1Motor表?

這是我的控制器show方法

def show 
    @user = User.find(params[:id]) 
    @motor = Motor.where(:name => @user.name) 
end 

然後我假設我需要改變我的update方法

if @user.update_attributes(params[:user]) 
    if params[:name] 
    # whats the correct way of changing all records that was previously the same name as user in the motor table? 
    end 
end 

感謝

+0

發生此問題是因爲您的表未規範化。而不是在Motor表中保存user_name保存user_id。您可以通過@ model.user.name訪問用戶名。這是正確的方法。 –

回答

0

你這樣做的方式是不利用協會。你的模型是什麼樣的?我覺得他們應該是這個樣子:

class User < ActiveRecord::Base 
    has_many :motors 
end 

class Motor < ActiveRecord::Base 
    belongs_to :user 
end 

當這是安裝程序,你可以扎入after_save回調。

class User < ActiveRecord::Base 
    has_many :motors 

    after_save :update_names 

    private 

    def update_names 
    self.motors.each do |motor| 
     motor.name = self.name 
    end 
    self.save! 
    end 
end 

如果有通過查找所有電機的舊名稱UserMotor你可能只是蠻力它之間沒有關聯,並重新命名。

old_user_name = @user.name 
@user.name = params[:name] 

@motors = Motor.where(name: old_user_name).all 
@motors.each do |motor| 
    motor.name = params[:name] 
    motor.save! 
end 
1

除非您有其他理由,否則我會建議使用委託。下面是它會怎樣看:

class User < ActiveRecord::Base 
    has_many :motors 
end 

class Motor < ActiveRecord::Base 
    belongs_to :user 
    delegate :name, :to => :user 
end 

現在,如果你打電話給@motor.name那麼它將返回到電機所屬的用戶名。這消除了電機表中名稱欄的需要,並且用戶更改名稱時不需要更新每個電機的名稱。

+0

這會假設有一個與列表相關的id列,但對嗎? – hellomello

+0

是的,該解決方案假定電機屬於用戶,因此具有user_id列。 – dhouty

相關問題