如果一条记录更改,则更新所有其他记录

时间:2013-10-18 06:10:18

标签: ruby-on-rails ruby ruby-on-rails-3 sql-update associations

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

我这样做的方式是name表的Motor列等于name表中的User

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

因此,在查看name1页面时,您会看到名为Motor的{​​{1}}的所有记录。

但是当我想更新name1表中的名称时,如何更改User表中应该与Motor关联的所有记录?

因此,如果我将user更改为name1,那么如何将last1中的所有name1更改为last1

这是我的控制器Motor方法

show

然后我假设我需要更改def show @user = User.find(params[:id]) @motor = Motor.where(:name => @user.name) end 方法

update

由于

2 个答案:

答案 0 :(得分:1)

除非您有其他理由,否则我建议您使用代表。以下是它的外观:

class User < ActiveRecord::Base
  has_many :motors
end

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

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

答案 1 :(得分: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