如何从另一个模型字段更新模型字段
How to update model field from another model field
我有两个模型
class Owner < ActiveRecord::Base
has_many :dogs
end
class Dog < ActiveRecord::Base
belongs_to :owner
accepts_nested_attributes_for :owner
before_validation :set_name
private
def set_name
self.name = owner.name
end
end
在提交表格后(因此调用 before_validation :set_name),我想将狗的名字更新为主人的名字。
此外,我的问题是:self.name = owner.name
的正确格式是什么?
我的表单如下所示:
<h1>Create a new Dog:</h1>
<%= form_for(@dog) do |f|%>
<div>
<%= f.label :breed%>
<%= f.text_field :breed%>
</div><br>
<div>
<%= f.label :age%>
<%= f.text_field :age%>
</div><br>
<div>
<h3>Create a new owner:</h3>
<%= f.fields_for :owner, Owner.new do |owner_attributes|%>
<%= owner_attributes.label :name, "Owner Name:" %>
<%= owner_attributes.text_field :name %>
<% end %>
</div>
<%= f.submit %>
<% end %>
您可以看到狗的名字没有 text_field,这是因为我希望主人的名字是狗的名字。感谢您的帮助!
为了保持同步,而不需要将主人的名字存储在狗对象上,我建议不要在狗 class 上使用属性作为名字,而是使用 ActiveSupport::Delegate 功能将 Dog
实例上的名称调用委托给它所属的 Owner
。这看起来像:
class Dog
belongs_to :owner
delegates :name, to: :owner
end
以上代码在 Dog
实例上创建了一个简单的 name
方法,它只调用 owner.name
。这样不管主人改什么名字,狗的名字都是从主人那里得到的。
我有两个模型
class Owner < ActiveRecord::Base
has_many :dogs
end
class Dog < ActiveRecord::Base
belongs_to :owner
accepts_nested_attributes_for :owner
before_validation :set_name
private
def set_name
self.name = owner.name
end
end
在提交表格后(因此调用 before_validation :set_name),我想将狗的名字更新为主人的名字。
此外,我的问题是:self.name = owner.name
的正确格式是什么?
我的表单如下所示:
<h1>Create a new Dog:</h1>
<%= form_for(@dog) do |f|%>
<div>
<%= f.label :breed%>
<%= f.text_field :breed%>
</div><br>
<div>
<%= f.label :age%>
<%= f.text_field :age%>
</div><br>
<div>
<h3>Create a new owner:</h3>
<%= f.fields_for :owner, Owner.new do |owner_attributes|%>
<%= owner_attributes.label :name, "Owner Name:" %>
<%= owner_attributes.text_field :name %>
<% end %>
</div>
<%= f.submit %>
<% end %>
您可以看到狗的名字没有 text_field,这是因为我希望主人的名字是狗的名字。感谢您的帮助!
为了保持同步,而不需要将主人的名字存储在狗对象上,我建议不要在狗 class 上使用属性作为名字,而是使用 ActiveSupport::Delegate 功能将 Dog
实例上的名称调用委托给它所属的 Owner
。这看起来像:
class Dog
belongs_to :owner
delegates :name, to: :owner
end
以上代码在 Dog
实例上创建了一个简单的 name
方法,它只调用 owner.name
。这样不管主人改什么名字,狗的名字都是从主人那里得到的。