2013-10-18 44 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

相关问题