我有两个模型User
和Motor
,每个表都有一个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
由于
答案 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
如果User
和Motor
之间没有任何关联,你可以通过找到所有具有旧名称的电机来强制它,并重命名它们。
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