2014-09-16 1 views
1

ClientAddress이 있고 Province에 속하는 내 응용 프로그램 내 관계가 있습니다.try 시도와 함께 델리게이트 사용 방법

는 이제 클라이언트 데이터 근처에 지방의 이름을 데려 가고 싶다는, 그래서 나는 client.rb의 방법을 만들어 :

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

문제는 없습니다 모든 클라이언트가 주소에 합류했다고합니다. 이 방법은 효과가 있지만보기에는 좋지 않습니다. 더 나은 방법으로 쓸 수 있습니까, 아마도 delegate 방법을 사용하고 있습니까?

+2

나에게 잘 보이는. 추함은 방법 안에 숨어 있습니다. –

+1

'address'에'delegate : name, to : : province'를 사용할 수 있으며'address.name'에 의해 액세스 할 수 있습니다. –

+1

[이것을 확인하십시오] (http://stackoverflow.com/questions/25758830/long-nil- safe-method-chains) 및 [this] (http://simonecarletti.com/blog/2009/12/inside-ruby-on-rails-delegate/) – Nithin

답변

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 
관련 문제