我在我的申请中有一个关系,其中一个Client
有Address
属于一个Province
。
现在我想将省名放在客户端数据附近,所以我在client.rb中创建了一个方法:
def province_name
try(:address).try(:province).try(:name)
end
问题在于并非每个客户都加入了地址。这种方法有效,但看起来很难看。是否有可能以更好的方式编写,可能使用delegate
方法?
答案 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