Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将委托与try-in-Rails一起使用_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何将委托与try-in-Rails一起使用

Ruby on rails 如何将委托与try-in-Rails一起使用,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在我的申请中有一个关系,其中一个客户的地址属于一个省 现在我想把省名放在客户机数据附近,所以我在client.rb中创建了一个方法: def province_name try(:address).try(:province).try(:name) end 问题是不是每个客户机都有加入地址。这种方法可行,但看起来很难看。是否可以使用委托方法以更好的方式编写?我们以前也取得了类似的成果: #app/models/client.rb class Client < ActiveRecor

我在我的申请中有一个关系,其中一个客户的地址属于一个省

现在我想把省名放在客户机数据附近,所以我在client.rb中创建了一个方法:

def province_name
  try(:address).try(:province).try(:name)
end

问题是不是每个客户机都有加入地址。这种方法可行,但看起来很难看。是否可以使用委托方法以更好的方式编写?

我们以前也取得了类似的成果:

#app/models/client.rb
class Client < ActiveRecord::Base
   has_one :address
end

#app/models/address.rb
class Address < ActiveRecord::Base
   belongs_to :province
   delegate :name, to: :province
end

#app/models/province.rb
class Province < ActiveRecord::Base
   has_many :addresses
   def name
      self[:name] ||= province
   end

   def province
     self[:province] ||= address
   end
end
您可能希望重构上述代码,但它非常适合我们:

#app/models/user.rb
class User < ActiveRecord::Base
   has_one :profile, inverse_of :user
   delegate :name, to: :profile
end

#app/models/profile.rb
class Profile < ActiveRecord::Base
   belongs_to :user, inverse_of :profile
   def name
        self[:name] ||= user.email
   end
end

我觉得不错。丑陋隐藏在一个方法中。在地址中,你可以使用delegate:name,to::province,在通过地址访问它。name和伙计们,我使用了两个委托:delegate:province\u name,to::address,to::address.rb中的allow\u nil:true和delegate:name,to::province,prefix:true,一切正常。你怎么认为?我喜欢这个解决方案。