0

我有两个模型UserMotor每个表都有一name列。我有一个用户页面,其中显示了用户拥有的所有电机。

我这样做的方式是使表格的nameMotor等于表格中的nameUser

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

因此,当查看name1' 页面时,您会看到Motor具有 name的所有记录name1

但是当我想更新表中的名称时User,如何更改Motor表中应该与user?

因此,如果我更改name1为 like last1,如何将 all 更改name1last1in Motortable?

这是我的控制器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

谢谢

4

2 回答 2

1

除非您有理由不这样做,否则我建议您使用委托。这是它的外观:

class User < ActiveRecord::Base
  has_many :motors
end

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

现在,如果您要调用@motor.name,那么它将返回电机所属用户的名称。这消除了电机表中名称列的需要,并且您无需在用户更改名称时更新每个电机的名称。

于 2013-10-18T06:31:36.463 回答
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
于 2013-10-18T06:19:48.850 回答