如何在Rails中使用委托

时间:2014-09-16 08:44:35

标签: ruby-on-rails ruby

我在我的申请中有一个关系,其中一个ClientAddress属于一个Province

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

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

问题在于并非每个客户都加入了地址。这种方法有效,但看起来很难看。是否有可能以更好的方式编写,可能使用delegate方法?

1 个答案:

答案 0 :(得分:0)

我们之前已经取得了类似的成就:

#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