class Advertise < ActiveRecord::Base
# Associations
# ------------
has_many :advertise_targets
# Scopes
# ------
...
# Macros
# ------
...
# Methods
# -------
...
end
class AdvertiseTarget < ActiveRecord::Base
# Associations
# ------------
belongs_to :advertise
...
end
Advertise
와 AdvertiseTarget
은 서로 1:N 의 관계.
API 호출 마다 Advertise 의 여러 AdvertiseTarget 들 중 매칭된 타겟이 어떤 것일지 계속 변하는데, 그 당시의 타겟 정보를 응답에 포함시켜야 한다.
attr_accessor와 PORO를 사용해 보자
class Advertise < ActiveRecord::Base
# Associations
# ------------
has_many :advertise_targets
attr_accessor :matching_target
# Scopes
# ------
...
# Macros
# ------
...
# Methods
# -------
...
def matching_target= target
raise ArgumentError, "#{target} is not MatchingTarget Type!" if target && !target.is_a?(MatchingTarget)
@matching_target = target
end
end
class AdvertiseTarget < ActiveRecord::Base
# Associations
# ------------
belongs_to :advertise
...
end
class MatchingTarget
attr_accessor :id, :type, :info
def initialize(id, type, info)
@id = id
@type = type
@info = info
end
end
코드도 간결하고. 게터 세터가 쉽게 생성 됨.
클래스의 속성들을 선언 해 놨기 떄문에, 스펙이 정해 짐.
응답 형태가 쉽고 예쁘게.
temporary state를 편하게.
matching_target 속성이 추가되었으나, 항상 사용되는 것은 아니다.
...
세터를 오버라이드 하여, 밸리데이션을 추가함.
MatchingTarget 클래스는 app/model/advertises 디렉토리 안에 넣음.
이런식으로 temporary state를 다루는 방식을 구글링 해 보았으나, 자료가 딱히 없음.
이런 상황이 별로 없어서 일까. 좋은 케이스가 아니어서 일까..
→ 이렇게 해도 될지 감이 안 옴.
좀 더 나은 방식이 있다면 알려주세요.