2017-05-09 17 views
2

을 감안할 때 : 콘솔에서 또는 뷰에서Rails 모델에서 가상 속성을 자동으로 반환 할 수 있습니까?

class Foo 
    has_one :bar 

    def bar_name 
    bar.name 
    end 
end 

class Bar 
    belongs_to :foo 
end 

, 나는 'baz'를 얻을 수 @foo.bar_name 수 있습니다.

나는 @foo.as_json(methods: :bar_name){"id"=>"abc123", "bar_name"=>"baz"}으로받을 수 있음을 알고 있습니다.

또한 속성을 비정규 화하여 비 가상으로 만들 수도 있지만이 경우에는하지 않을 것입니다.

가상 속성이 포함 된 모델을 자동으로 반환 할 수 있습니까?

#<Foo id: "abc123", bar_name: "baz">

은 내가 모델의 중첩 된 컬렉션과 대형 개체를 구성하고 있기 때문에이 작업을 수행 할 수 및 as_json 전화 나에게서 멀리 추상화된다.

+0

클라이언트에'# '를 보내거나'Foo' 객체를 콘솔에 출력하려고합니다 (예 :'puts fooobj # => # )? – niceman

+0

클라이언트에 아무 것도 보내지 않는다고 가정 해 봅시다. 메서드의 결과를 명시 적으로 호출하지 않고 콘솔에 표시하기 만하면됩니다. –

+2

'as_json' 응답에서 이것을 원합니까? 그렇다면 모델 자체에서'as_json'을 다시 정의 할 수 있습니다. 이것을 객체 표현에 넣고 싶다면'inspect'을 다시 정의 할 수 있습니다. – engineersmnky

답변

2

100 % 확실히 나는 당신의 명시적인 예하는 것처럼 이제 기본적으로 @foo.as_json 의지에 대한 호출이 bar_name을 포함 할 우려가 as_json 관련이 있는지 이해하지만.

미운 사람은 권장하지 않지만 foo의 검사를 변경할 수 있습니다. 예 :

class Foo 
    def inspect 
    base_string = "#<#{self.class.name}:#{self.object_id} " 
    fields = self.attributes.map {|k,v| "#{k}: #{v.inspect}"} 
    fields << "bar_name: #{self.bar_name.inspect}" 
    base_string << fields.join(", ") << ">" 
    end 
end 

을 다음과 같이 난 아직 확실하지 오전하지만이 의도 경우 #<Foo id: "abc123", bar_name: "baz"> 그런 다음 "검사 표기법은"해당 정보를 볼 수 있으며, 만약 그렇다면 당신이 원하는 이유.

+0

네, 저의 질문이 끝날 때 언급 한 실제 사례를 실제로 해결합니다. 누군가 실제로 솔루션을 먼저 게시 한 다음 삭제했습니다. 그러나 나는 여전히 한 번의 호출로 렌더링하기 전에 할 수 있는지 여부를 알고 싶었습니다. @mmichael은 그렇지 않다는 것을 확인한 것 같습니다. –

+1

오브젝트 표기법에서 '표기법'을 재정의해야 할 경우 "렌더링하기 전에"를 의미합니까? – engineersmnky

+0

콘솔, 뷰 또는 json 수신 중 무엇인지 배웠던 것 같습니다. 가상 속성의 포함은 전적으로 관심사입니다. 그렇지 않으면, 메소드 호출을 할 수있을 때 반환 값에 "자동"을 포함시킬 필요가 없습니다. 그래서 정답은 "네, 가능 합니다만, 필요한 모든 것이'as_json'을 덮어 쓰는 것만 큼 가치있는 일은 아닙니다. 고맙습니다. –

0

당신은 attr_accessor를 사용할 수 있습니다 - Rails docs 당 :

읽을 인스턴스 변수 (@name) 및 해당 액세스 방법을 생성, 이름이 symbol.id2name 인이 모듈에 대한 명명 된 속성을 정의 그것. 또한 name =이라는 메서드를 만들어 속성을 설정합니다. 그래서이

class Foo 
    has_one :bar 

    def bar_name 
    bar.name 
    end 
    def as_json(options={}) 
    super(options.merge!(methods: :bar_name)) 
    end 
end 

를 작동하는지

+0

고맙지 만, 객체와 객체가 검색 될 때 가상 속성을 포함하지 않는'attr_reader'가 있습니다. 메소드에 대한 명시 적 호출을하지 않고 콘솔 출력을 얻을 수 있는지 여부를 묻는 것입니다. –

+1

메소드 호출없이 가상 속성을 포함 할 수 없습니다. 'model.instance_methods'도 있지만, 이것은 다소 덜 명백한 호출입니다. Rails가 내장 된'attr_accessor' 파일에 원숭이 패치를하지 않아서, 메소드 호출을해야 할 것 같습니다. – mmichael