Ruby on rails 一次设置多个对象属性是否有行业标准?

Ruby on rails 一次设置多个对象属性是否有行业标准?,ruby-on-rails,ruby,oop,Ruby On Rails,Ruby,Oop,在我的rails模型中,我有时会覆盖单个属性设置器,以便它设置多个属性,如下所示: class UserSubscription < ActiveRecord::Base # multi setter! def subscription_plan=(sp) self.duration = sp.duration self.num_lessons = sp.num_lessons

在我的rails模型中,我有时会覆盖单个属性设置器,以便它设置多个属性,如下所示:

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
class-UserSubscription
虽然最初我认为这有点聪明,但随着时间的推移(几年),我觉得这给我的旧代码带来的透明度不足让我感到不安

因此,我没有“覆盖/重载”,而是专门调用这些方法“按订阅计划设置属性”或类似的方法。相比之下,这感觉更笨重,有点笨重,但烟雾和镜子更少

我突然想到,这一定是别人处理过的事情,甚至可能是有名字的事情。甚至可能有一个行业标准来实现这一点,或者设计模式


有人给我提建议吗?

你可以使用
分配属性(持续时间:sp.duration,num\u课程:sp.num\u课程)
如果订阅计划中有这些对象,那么为什么不在需要时使用关系并委托给订阅计划?简单地更改方法名称如何,例如,在本例中,在j-dexx下创建订阅(ss),因为我需要在创建订阅时保留订阅计划详细信息的记录,因为随着我找到合适的价格,它们可能会在将来发生变化。但是,任何已经启动的订阅都需要知道如何更新自身以及单独为自身设置的规格。如果订阅计划是一种关系,也许您可以尝试使用嵌套属性来清理它?然后,您不需要编写任何setter,只需在创建过程中一次传入所有属性即可。编辑:仅限Rails 4+版本