【问题标题】:How to update model field from another model field如何从另一个模型字段更新模型字段
【发布时间】:2020-07-19 06:57:57
【问题描述】:

我有两个模型

    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),我想将 Dog name 更新为 Owner 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 %>

您可以看到 Dog 没有名称的 text_field,这是因为我希望所有者名称是狗的名称。感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails ruby forms model form-for


    【解决方案1】:

    为了保持同步,而不需要在狗对象上存储所有者的名字,我建议不要在狗类上使用属性作为名称,而是使用ActiveSupport::Delegate 功能来将Dog 实例上的名称调用委托给它所属的Owner。这看起来像:

    class Dog
      belongs_to :owner
      delegates :name, to: :owner
    end
    

    上面的代码在Dog 实例上创建了一个精简的name 方法,它只调用owner.name。这样无论主人改什么名字,狗的名字总是来源于主人。

    【讨论】:

    • 谢谢!帮助了一堆。我的页面上有另一个问题,想知道你是否也能帮忙解决这个问题?如果没有,非常感谢您的帮助!
    • 当然,刚刚检查过并继续做出回应。如果您对我在 cmets 中的回答有任何疑问,请告诉我,我很乐意为您详细说明和调整答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2018-09-21
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多