如何从另一个模型字段更新模型字段

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。这样不管主人改什么名字,狗的名字都是从主人那里得到的。