2017-01-17 3 views
1

В моей модели рельсы, я иногда перезаписать один атрибут сеттер, так что он устанавливает более чем один атрибут как так:Есть ли промышленный стандарт для установки нескольких атрибутов объектов одновременно?

class UserSubscription < ActiveRecord::Base 

    # multi setter! 
    def subscription_plan=(sp) 
    self.duration      = sp.duration 
    self.num_lessons     = sp.num_lessons 
    self.checkout_active_duration_days = sp.checkout_active_duration_days 
    self.num_collaborators_can_have = sp.num_collaborators 
    super sp 
    end 

    # multi setter! 
    def stripe_subscription=(ss) 
    self.stripe_subscription_id = ss.id 
    self.current_period_start = UserSubscription.stripe_stamp_to_datetime(ss.current_period_start) 
    self.current_period_end  = UserSubscription.stripe_stamp_to_datetime(ss.current_period_end) 
    end 

end 

Хотя изначально я думал, что это вроде умный, в течение долгого времени (лет) я я чувствовал, что отсутствие прозрачности, которое дает мой старый код, заставляет меня чувствовать себя неловко.

Так что я поиграл с «переписыванием/перегрузкой», но специально назвал эти методы #set_attrs_by_subscription_plan или что-то подобное. Это кажется более громоздким и несколько громоздким по сравнению, но меньше дыма и зеркал.

Мне кажется, что это должно быть то, с чем другие сталкивались, и, возможно, даже то, что имеет имя. Там может быть даже отраслевой стандарт для этого, или шаблон дизайна.

У кого-нибудь есть предложения/рекомендации для меня?

+1

Если у вас есть эти объекты в плане подписки, почему бы вам не использовать отношение и не делегировать его в план подписки, когда это необходимо? –

+0

Как просто изменить имена методов, например create_stripe_subscript (ss) – Yule

+0

@ j-dexx В этом случае, поскольку мне нужно сохранить запись деталей subscription_plan во время создания подписки, так как они потенциально могут измениться в будущем как Я нахожу правильную цену. Но любая подписка, уже начатая, должна знать, как обновить себя и какие спецификации были для себя в одиночку. – pixelearth

ответ

1

Вы можете использовать assign_attributes(duration: sp.duration, num_lessons: sp.num_lessons).

Смежные вопросы